设为首页 收藏本站
查看: 682|回复: 0

shell从入门到放弃(中)

[复制链接]
发表于 2018-8-24 06:54:59 | 显示全部楼层 |阅读模式
  此文承接 shell从入门到放弃(上)
  更加深入 ======下篇======
DSC0000.jpg

  由此,继续从小白到放弃的第二部分@_@
一、shell的运算符  Shell支持很多运算符,包括:Shell算数运算符、关系运算符、布尔运算符、字符串运算符等
  算术运算
  算术运算符:
  +,-
  *, /
  %:取余
  **:次方
  算术运算格式:
  (1) let  VAR=算术表达式
  (2) VAR=$[算术表达式]
  (3) VAR=$((算术表达式))
  (4) VAR=$(expr $ARG1 $OP $ARG2)
  例如,两个数相加:
#!/bin/bash  

  
val=`expr 2 + 2` #或者 var=$(expr 2 + 2 )
  
echo "Total value : $val"
  运行脚本输出:
Total value : 4  两点注意:

  •   表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  •   完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。表示命令替换,或者使用$()
#!/bin/sh  

  
a=10
  
b=20
  
val=`expr $a + $b`
  
echo "a + b : $val"
  

  
val=`expr $a - $b`
  
echo "a - b : $val"
  

  
val=`expr $a \* $b`
  
echo "a * b : $val"
  

  
val=`expr $b / $a`
  
echo "b / a : $val"
  

  
val=`expr $b % $a`
  
echo "b % a : $val"
  

  
if [ $a == $b ]
  
then
  
   echo "a is equal to b"
  
fi
  

  
if [ $a != $b ]
  
then
  
   echo "a is not equal to b"
  
fi
  
运行结果:a + b : 30
  
a - b : -10
  
a * b : 200
  
b / a : 2
  
b % a : 0
  
a is not equal to b
  注意:

  •   乘号(*)前边必须加反斜杠转义(\)才能实现乘法运算;
  关系运算符
  关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
运算符说明举例-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 true。-ne检测两个数是否相等,不相等返回 true。[ $a -ne $b ] 返回 true。-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。-ge检测左边的数是否大等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。#!/bin/sh  

  
a=10
  
b=20
  
if [ $a -eq $b ]
  
then
  
echo "$a -eq $b : a is equal to b"
  
else
  
echo "$a -eq $b: a is not equal to b"
  
fi
  
运行结果为
  
10 -eq 20: a is not equal to b
布尔运算符
运算符说明举例!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。  例子
#!/bin/sh  

  
a=10
  
b=20
  

  
if [ $a -lt 100 -a $b -gt 15 ]
  
then
  
   echo "$a -lt 100 -a $b -gt 15 : returns true"
  
else
  
   echo "$a -lt 100 -a $b -gt 15 : returns false"
  
fi
  

  
运行结果为
  
10 -lt 100 -a 20 -gt 15 : returns true
  字符串运算符
  
运算符说明举例=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。-n检测字符串长度是否为0,不为0返回 true。[ -z $a ] 返回 true。str检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。#!/bin/sh  

  
a="abc"
  
b="efg"
  

  
if [ $a = $b ]
  
then
  
   echo "$a = $b : a is equal to b"
  
else
  
   echo "$a = $b: a is not equal to b"
  
fi
  
运行结果
  
abc = efg: a is not equal to b
  文件测试运算符
  文件测试运算符用于检测 Unix 文件的各种属性。
操作符说明举例-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -b $file ] 返回 false。-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。-p file检测文件是否是具名管道,如果是,则返回 true。[ -p $file ] 返回 false。-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。  这个很简单,不举例子了。
二、小插曲之字符串和注释  字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
  
  单引号
  str='this is a string'
  单引号字符串的限制:
  单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
  双引号
  your_name='qinjx'str="Hello, I know your are \"$your_name\"! \n"
  双引号的优点:
  双引号里可以有变量
  双引号里可以出现转义字符
  拼接字符串
your_name="qinjx"  
greeting="hello, "$your_name" !"
  
greeting_1="hello, ${your_name} !"
  
echo $greeting $greeting_1
  获取字符串长度
string="abcd"echo ${#string} #输出 4  
  提取子字符串
string="alibaba is a great company"echo ${string:1:4} #输出liba  查找子字符串
string="alibaba is a great company"echo `expr index "$string" is`三、打了激素的数组定义数组
  在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
  array_name=(value1 ... valuen)
  例如:
array_name=(value0 value1 value2 value3)  或者
array_name=(  
value0
  
value1
  
value2
  
value3
  
)
  还可以单独定义数组的各个分量:
array_name[0]=value0  
array_name[1]=value1
  
array_name[2]=value2
  可以不使用连续的下标,而且下标的范围没有限制。
读取数组
  读取数组元素值的一般格式是:
  ${array_name[index]}
  例如:
valuen=${array_name[2]}  举个例子:
#!/bin/sh  

  
NAME[0]="Zara"
  
NAME[1]="Qadir"
  
NAME[2]="Mahnaz"
  
NAME[3]="Ayan"
  
NAME[4]="Daisy"
  
echo "First Index: ${NAME[0]}"
  
echo "Second Index: ${NAME[1]}"
  运行脚本,输出:
$./test.sh  
First Index: Zara
  
Second Index: Qadir
  使用@ 或 * 可以获取数组中的所有元素,例如:
${array_name
  • }  
    ${array_name[@]}
      举个例子:
    #!/bin/sh  

      
    NAME[0]="Zara"
      
    NAME[1]="Qadir"
      
    NAME[2]="Mahnaz"
      
    NAME[3]="Ayan"
      
    NAME[4]="Daisy"
      
    echo "First Method: ${NAME
  • }"
      
    echo "Second Method: ${NAME[@]}"
      运行脚本,输出:
    $./test.sh  
    First Method: Zara Qadir Mahnaz Ayan Daisy
      
    Second Method: Zara Qadir Mahnaz Ayan Daisy
    获取数组的长度
      获取数组长度的方法与获取字符串长度的方法相同,例如:
    # 取得数组元素的个数  
    length=${#array_name[@]}
      
    # 或者
      
    length=${#array_name
  • }
      
    # 取得数组单个元素的长度
      
    lengthn=${#array_name[n]}
    四、if-else了不起的条件判断  if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

    •   if ... fi 语句;
    •   if ... else ... fi 语句;
    •   if ... elif ... else ... fi 语句。
    1) if ... else 语句
      if ... else 语句的语法:
    if [ expression ]  
    then
      
       Statement(s) to be executed if expression is true
      
    fi
      如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。
      最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。
      注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。
      举个例子:
    #!/bin/sh  

      
    a=10
      
    b=20
      

      
    if [ $a == $b ]
      
    then
      
    echo "a is equal to b"
      
    fi
      

      
    if [ $a != $b ]
      
    then
      
    echo "a is not equal to b"
      
    fi
      运行结果:
    a is not equal to b2) if ... else ... fi 语句
      if ... else ... fi 语句的语法:
    if [ expression ]  
    then
      
       Statement(s) to be executed if expression is true
      
    else
      
       Statement(s) to be executed if expression is not true
      
    fi
      如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。
      举个例子:
    #!/bin/sh  

      
    a=10
      
    b=20
      

      
    if [ $a == $b ]
      
    then
      
    echo "a is equal to b"
      
    else
      
    echo "a is not equal to b"
      
    fi
      执行结果:
    a is not equal to b3) if ... elif ... fi 语句
      if ... elif ... fi 语句可以对多个条件进行判断,语法为:
    if [ expression 1 ]  
    then
      
       Statement(s) to be executed if expression 1 is true
      
    elif [ expression 2 ]
      
    then
      
       Statement(s) to be executed if expression 2 is true
      
    elif [ expression 3 ]
      
    then
      
       Statement(s) to be executed if expression 3 is true
      
    else
      
       Statement(s) to be executed if no expression is true
      
    fi
      哪一个 expression 的值为 true,就执行哪个 expression 后面的语句;如果都为 false,那么不执行任何语句。
      举个例子:
    #!/bin/sh  

      
    a=10
      
    b=20
      

      
    if [ $a == $b ]
      
    then
      
    echo "a is equal to b"
      
    elif [ $a -gt $b ]
      
    then
      
    echo "a is greater than b"
      
    elif [ $a -lt $b ]
      
    then
      
    echo "a is less than b"
      
    else
      
    echo "None of the condition met"
      
    fi
      运行结果:
    a is less than b  if ... else 语句也可以写成一行,以命令的方式来运行,像这样:
    if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;  if ... else 语句也经常与 test 命令结合使用,如下所示:
    num1=$[2*3]num2=$[1+5]if test $[num1] -eq $[num2]thenecho 'The two numbers are equal!'elseecho 'The two numbers are not equal!'fi  输出:
    The two numbers are equal!  test 命令用于检查某个条件是否成立,与方括号([ ])类似。
    五、case-esac多分支选择  case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分支选择结构。
      case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
    case 值 in  
    模式1)
      
        command1
      
        command2
      
        command3
      
        ;;
      
    模式2)
      
        command1
      
        command2
      
        command3
      
        ;;
      
    *)
      
        command1
      
        command2
      
        command3
      
        ;;
      
    esac
      case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。
      取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
      下面的脚本提示输入1到4,与每一种模式进行匹配:
    echo 'Input a number between 1 to 4'echo 'Your number is:\c'read aNumcase $aNum in1)  echo 'You select 1';;2)  echo 'You select 2';;3)  echo 'You select 3';;4)  echo 'You select 4';;*)  echo 'You do not select a number between 1 to 4';;esac  输入不同的内容,会有不同的结果,例如:
    Input a number between 1 to 4  
    Your number is:3
      
    You select 3
      再举一个例子:
    #!/bin/bash  

      
    option="${1}"
      
    case ${option} in
      
    -f) FILE="${2}"
      
    echo "File name is $FILE"
      
    ;;
      
    -d) DIR="${2}"
      
    echo "Dir name is $DIR"
      
    ;;
      
    *)
      
    echo "`basename ${0}`:usage: [-f file] | [-d directory]"
      
    exit 1 # Command to come out of the program with status 1
      
    ;;
      
    esac
      运行结果:
    $./test.sh  
    test.sh: usage: [ -f filename ] | [ -d directory ]
      
    $ ./test.sh -f index.htm
      
    $ vi test.sh
      
    $ ./test.sh -f index.htm
      
    File name is index.htm
      
    $ ./test.sh -d unix
      
    Dir name is unix
      
    $



  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-555674-1-1.html 上篇帖子: linux shell中的位置参数变量 下篇帖子: bash shell 内部命令及添加
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表