liunx day04 基础知识学习

本文介绍了Shell脚本中的系统环境变量,如PATH、USER、UID等,并详细讲解了测试语句的用法,包括关系运算符、文件运算符及其在逻辑判断中的应用。通过实例展示了如何找出三个数中的最大值、检查文件权限以及判断文件新旧。此外,文章还涵盖了if分支语句的多种形式,包括嵌套、elif和else的情况。最后,提到了while、until循环和for循环的使用方法,以及函数和数组的概念。通过这些基础知识,读者可以更好地理解和编写Shell脚本。

一、shell脚本系统环境变量
   系统环境变量:和系统相关的并且已经预定义好的变量。
   PATH: 环境变量中的路径信息。文件或者命令在当前路径下找不到则从PATH路径中查找。
   USER:当前的用户名
   UID:当前用户的id
   HOME:当前用户的主目录位置
   PWD:当前所在的位置
   TERM:终端的类型 xterm
   备注: 多行注释表示可以对跨行的代码一次性的注释。格式如下
       :<<!
          sadgasd
        !
二、测试语句
   1.中括号用来实现逻辑运算,是计算测试语句的运算符 [ ]
   2.关系运算符
   -eq : 比较左右两个值是否相等
   -ne:比较两个值不相等则为真
   -gt  :比较左值是否大于右值,如果大于则结果为真
   -ge  :比较左值大于或者等于右值,满足则为真
   -lt  : 比较左值是否小于右值,如果小于则结果为真
   -le :比较左值是否小于等于右值,如果满足则结果为真
   -o  :表示或者的关系,表达式左侧和右侧有一个为真结果为真
  - a : 表示并
1

 输入三个值: 判断哪个值最大,打印出来。
 案例:
   echo "请输入三个值"
    read num1 num2 num3

    if [ $num1 -ge  $num2 -a $num1 -ge $num3 ]
    then
        echo "最大值${num1}"
    fi
                if [ $num2 -ge  $num1 -a $num2 -ge $num3 ]
      then
    echo "最大值${num2}"
       fi
    
    if [ $num3 -ge  $num1 -a $num3 -ge $num2 ]
   then
    echo "最大值${num3}"
   fi

   3.文件运算符
     -b 文件名:判断文件是否为块设备文件
     -x 文件名:判断文件是否有执行权限,不管是哪个用户,只要有就行
     -r 文件名:判断文件是否有读权限,不管是哪个用户,只要有就行
     -w 文件名:判断文件是否有写权限,不管是哪个用户,只要有就行
     -e 文件名: 判断文件是否存在
     -f  文件名:判断文件是否为普通文件
     -p 文件名:判断文件是否为管道文件
     -s 文件名: 判断文件是否存在,并且不为空
     文件名1 -ot 文件名2: 判断文件1是否比文件2更旧
     文件名1 -nt  文件名2:判断文件1是否比文件2 更新
   案例:
      echo "请输入文件名"
      read myfile
      if test -x $myfile
      then
    echo "danny有可执行权限"
      fi

    if test './danny' -nt $myfile
    then
    echo "danny是否比${myfile}新"
     fi

     if test './danny' -ot $myfile
     then
    echo "danny更旧"
     fi

  4.test语句:用来替换中括号,可以做逻辑运算
     格式: test 测试条件
     等价: [ 测试条件 ]
     案例: if test $a -gt $b
     练习:判断文件是否存在,如果存在则判断是否为目录,如果是目录则跳 转到目录中后创建danny文件。
      
三、if分支语句
  1.  if是分支语句,使用格式如下
     if [ 测试语句 ]
     then
            语句
     fi
   2.c语言中的if语句格式
   if(条件)
   {
       语句;
    }
  3.格式2:如果满足条件执行if,如果不满足判断第二个条件elif,如果都不满足执行else
     if 测试语句1
     then
            语句2
     elif  测试语句3
     then
           语句4
     else
           语句5
     fi
   执行:首先判断测试语句1是否满足,如果满足执行语句2后结束if,如果if测试语句为假,则继续判断测试语句3,如果测试语句3为真,执行语句4后结束if语句,如果条件都不满足则执行else中的语句5;elif可以有多个。
    练习:学生成绩的等级打印,如果输入的成绩是100到90之间则打印A等,如果是80到89则打印b等,如果是70到79打印c等,剩下所有的都是d等,输入成绩只可以是0到100之间。    
   echo "请输入成绩"
   read score

   if test $score -ge 90 -a $score -le 100
   then
    echo "你的成绩${score} 是A等"
    elif test $score -ge 80 #如果第一个条件不满足则成绩一定小于90
    then
    echo "你的成绩${score} 是B等"
    elif test $score -ge 70
    then
    echo "你的成绩${score} 是C等"
    else 
    echo "你的成绩${score} 是D等"
   fi

4.if的嵌套:在if中还有if else
  格式:  
    if 测试语句1
    then   
           if 测试语句2
           then  
                 语句3
           else
               语句4
          fi
   elif 测试语句5
   then
         语句6
   else
        语句7;
   fi
  执行: 先判断测试语句1是否满足,如果满足则继续判断测试语句2,如果测试语句2满足则执行语句3后退出外部if,如果测试语句2不满足,
  练习: 输入一个年份,判断是否为闰年(年份可以被4整除,不可以被100整除的年份,或者可以被400整除) 

   read year

num1=`expr $year % 4`
num2=`expr $year % 100`
num3=`expr $year % 400`

if [ $num3 -eq 0 ] #可以被400整除
then
    echo "${year}是闰年"
else
    if [ $num1 -eq 0 ]
    then
        if [ $num2 -ne 0 ]
        then
            echo "${year}是闰年"
        else
            echo "${year}不是闰年"
        fi
    else
        echo "${year}不是闰年"
    fi
fi

5.while循环语句
   1>循环语句:不断的执行某一些代码。
   2>格式:  while 测试语句
               do
                     循环体
               done
    3>c语言中:
              while(判断语句)
             {
                      循环体
             }
    4>执行:先判断测试语句是否为真,如果为真则执行循环体代码,然后继续判断测试语句是否为真一直执行循环体,直到测试语句为假则结束
   练习:请用while循环计算1到100的和
   #! /bin/bash
num=0 
sum=0
while [ $num -lt 100 ]
do
 num=`expr $num + 1`
 sum=`expr $sum + $num`
done
echo "$sum"

5.until循环
   格式: until 测试语句
             do
                      循环体
              done
    特点: 条件不满足则执行循环体,条件满足则退出循环。
    练习:请用until循环,计算1到100的奇数和。


6.for循环
   格式: for 变量 in 列表
              do
                    循环体
              done
  执行:每次从值列表中取出一个值存入到变量中,进入循环体执行代码,知道所有列表中的值被取出。
  退出循环:break和continue。

  练习: 请用for循环打印出所有的参数。例如 ./abc.sh  1 2 a d dsd 
   temp=1
   for num in $*
    do
    echo "第${temp}个参数是${num}"
    temp=`expr $temp + 1`
    done

练习: 请打印当前目录下的文件和目录,如果是文件 在最后面加[文件],如果是目录则在目录最后面加上[目录]
   #!/bin/bash

for num in `ls ~` #只可以在当前目录
do
    if [ -f $num ]
    then
        echo "${num}[文件]"
    elif [ -d $num ]
    then
        echo "${num}[目录]"
    else
        echo "${num}[什么都不是]"
    fi
done

7.函数
  函数:一块代码的封装,方便使用,减少代码量,使代码模块化。
  格式: function 函数名()
            {
                  函数体;
           }
   调用: 函数名;  直接    ·使用函数名的方式调用函数。
   注意:function可以省略。
 
8.数组
  定义: 多个数据的集合,使用方便,一个名字加下标就表示一个变量
  格式:数组名=(值1 值2)
  使用:${数组名[下标]}    例如 arr=(1 2 'a')  echo "${ar[0]}"
  赋值:数组名[下标]=值  ;可以修改数组中的值。
  注意:下标从0开始,arr[0]表示第一个元素。在数组中可以有多中数据类型。

练习
  1 #! /bin/bash
  2
  3 myarr=(1 2 'a' "sdg") #定义一个数组
  4 echo "${myarr[4]}"
  5 myarr[4]=danny   #给元素赋值
  6
  7 echo "${myarr[4]}"
  8 #打印所有元素
  9 for temp in ${myarr[@]}
 10 do
 11     echo $temp
 12 done
 13 echo "${#myarr[4]}" #获取单个元素的长度
 14 echo "${myarr[@]}" #表示所有的参数
~                                          
 作业1:打印九九乘法表(用到循环嵌套)---  罗泽成批改
#九九乘法表
for i  in  {1..9}
do
    for j in {1..9}
    do
        n=`expr $i \* $j`
        echo -n "$i * $j =$n  "
        if test $j -ge $i
        then
            echo
            break
        fi
    done
done 


  作业2:写一个函数,用来计算两个数的和以及两个数的差,例如传入的参数是1 + 1 则打印出2,如果是1 + a则提示输入错误。如果传入 1 - 3则打印-2,限定只计算加法和减法。 --
 [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配

#函数的调用 加法 减法
function add()
{
    if [[ $1 =~ ^[a-zA-Z] ]] || [[ $2 =~ ^[a-zA-Z] ]] 
    then 
        echo "参数错误"
    else
        k=`expr $1 + $2`
        echo "${1} + ${2} = $k"
    fi
}


function sub()
{
    
    if [[ $1 =~ ^[a-zA-Z] ]] || [[ $2 =~ ^[a-zA-Z]  ]] 
    then 
        echo "参数错误"
    else
        k=`expr $1 - $2`
        echo "${1} - ${2} = $k"
    fi
}

echo "算术模式"
if test $2 = "+" 
then 
    add $1 $3
fi
if test $2 = "-" 
then 
    sub $1 $3
fi


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值