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

玩转Linux - shell 编程基础(二)

[复制链接]

尚未签到

发表于 2018-8-19 07:32:27 | 显示全部楼层 |阅读模式
  
  简述
  使用 linux 就离不开 shell,那么也就是说也离不开 shell 编程。很多时候服务器都需要编写一些计划任务来定时运行的,所以掌握一些基本的 shell 编程基础很有必要。
  数组
  Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。数组中可以存放多个值,与大部分编程语言类似,数组元素的下标由0开始。
  定义数组
  在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。
  定义数组的一般形式为:
  数组名=(值1 值2 ... 值n)
  例如:
array_name=(value0 value1 value2 value3)  或者
array_name=(  
value0
  
value1
  
value2
  
value3
  
)
  还可以单独定义数组的各个分量:
array_name[0]=value0  
array_name[1]=value1
  
array_name[n]=valuen
  可以不使用连续的下标,而且下标的范围没有限制。
  读取数组
  读取数组元素值的一般格式是:
  ${数组名[下标]}
  例如:
valuen=${array_name[n]}  shell 编程实战:
#!/bin/bash  
my_array=(A B "C" D)echo "第一个元素为: ${my_array[0]}"
  
echo "第二个元素为: ${my_array[1]}"
  
echo "第三个元素为: ${my_array[2]}"
  
echo "第四个元素为: ${my_array[3]}"
  执行脚本,输出结果如下所示:
$ chmod +x test.sh  
$ ./test.sh
  
第一个元素为: A
  
第二个元素为: B
  
第三个元素为: C
  
第四个元素为: D
  使用 @ 或者 * 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}  shell 编程实战:
#!/bin/bashmy_array[0]=A  
my_array[1]=B
  
my_array[2]=C
  
my_array[3]=Decho "数组的元素为: ${my_array
  • }"echo "数组的元素为: ${my_array[@]}"
      执行脚本,输出结果如下所示:
    $ chmod +x test.sh  
    $ ./test.sh
      
    数组的元素为: A B C D
      
    数组的元素为: A B C D获取数组的长度
      获取数组的长度
      获取数组长度的方法与获取字符串长度的方法相同,例如:
    # 取得数组元素的个数  
    length=${#array_name[@]}
      
    # 或者
      
    length=${#array_name
  • }
      
    # 取得数组单个元素的长度
      
    lengthn=${#array_name[n]}
      shell 实战编程:
    #!/bin/bashmy_array[0]=A  
    my_array[1]=B
      
    my_array[2]=C
      
    my_array[3]=Decho "
      
    数组元素个数为: ${#my_array
  • }"echo "
      
    数组元素个数为: ${#my_array[@]}"
      执行脚本,输出结果如下所示:
    $ chmod +x test.sh  
    $ ./test.sh
      
    数组元素个数为: 4
      
    数组元素个数为: 4
      注释
      以"#"开头的行就是注释,会被解释器忽略。
      sh里没有多行注释,只能每一行加一个#号。只能像这样:
    #--------------------------------------------  
    # 这是一个注释
      
    #--------------------------------------------
      
    ##### 用户配置区 开始 #####
      
    #
      
    #
      
    # 这里可以添加脚本描述信息
      
    #
      
    #
      
    ##### 用户配置区 结束  #####
      如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
      每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
      传递参数
      我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。
      n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
      实例
      以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名:
    #!/bin/bash  
    echo "Shell 传递参数实例!";
      
    echo "执行的文件名:$0";
      
    echo "第一个参数为:$1";
      
    echo "第二个参数为:$2";
      
    echo "第三个参数为:$3";
      为脚本设置可执行权限,并执行脚本,输出结果如下所示:
    $ chmod +x test.sh  
    $ ./test.sh 1 2 3
      
    Shell 传递参数实例!
      
    执行的文件名:test.sh
      
    第一个参数为:1
      
    第二个参数为:2
      
    第三个参数为:3
      另外,还有几个特殊字符用来处理参数:
      参数处理    说明

    •   $#    传递到脚本的参数个数
    •   $*    以一个单字符串显示所有向脚本传递的参数。
    •   如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
    •   $$    脚本运行的当前进程ID号
    •   $!    后台运行的最后一个进程的ID号
    •   $@    与$*相同,但是使用时加引号,并在引号中返回每个参数。
    •   如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
    •   $-    显示Shell使用的当前选项,与set命令功能相同。
    •   $?    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    #!/bin/bash  
    echo "Shell 传递参数实例!";
      
    echo "第一个参数为:$1";
      
    echo "参数个数为:$#";
      
    echo "传递的参数作为一个字符串显示:$*";
      执行脚本,输出结果如下所示:
    $ chmod +x test.sh  
    $ ./test.sh 1 2 3
      
    Shell 传递参数实例!
      
    第一个参数为:1
      
    参数个数为:3
      
    传递的参数作为一个字符串显示:1 2 3
      与@ 区别:

    •   相同点:都是引用所有参数。
    •   不同点:只有在双引号中体现出来。
      假设在脚本运行时写了三个参数 1、2、3,
      则 " * " 等价于 "1 2 3"(传递了一个参数),
      而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
    #!/bin/bash  
    echo "-- \$* 演示 ---"
      
    for i in "$*"; do
      
        echo $i
      
    done
      

      
    echo "-- \$@ 演示 ---"
      
        for i in "$@"; do
      
        echo $i
      
    done
      执行脚本,输出结果如下所示:
    $ chmod +x test.sh  
    $ ./test.sh 1 2 3
      
    -- $* 演示 ---
      
    1 2 3
      
    -- $@ 演示 ---
      
    1
      
    2
      
    3
      基本运算符
      
      Shell 和其他编程语言一样,支持多种运算符,包括:

    •   算数运算符
    •   关系运算符
    •   布尔运算符
    •   字符串运算符
    •   文件测试运算符
      原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
      expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
      例如,两个数相加(特别注意:使用的是反引号 ` 而不是单引号 '):
    #!/bin/bash  
    val=`expr 2 + 2`
      
    echo "两数之和为 : $val"
      执行脚本,输出结果如下所示:
    两数之和为 : 4  注意:

    •   表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
    •   完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
      算术运算符
      
      下面列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
    运算符      说明  举例+ 加法`expr $a + $b`结果为 30- 减法 `expr $a - $b` 结果为 10* 乘法`expr $a \* $b`结果为  200/    除法  `expr $b / $a`结果为 2%    取余 `expr $b % $a`结果为 0=    赋值a=$b 将把变量 b 的值赋给 a==    相等用于比较两个数字相同则返回 true([ $a == $b ] 返回 false)!=    不相等用于比较两个数字不相同则返回 true([ $a != $b ] 返回 true)  注意:条件表达式要放在方括号之间,并且要有空格,例如: [a==b] 是错误的,必须写成 [ a==b ]。
      示例
      算术运算符实例如下:
    #!/bin/bash  
    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 等于 b"
      
       fi
      

      
    if [ $a != $b ]then
      
       echo "a 不等于 b"
      
       fi
      执行脚本,输出结果如下所示:
    a + b : 30  
    a - b : -10
      
    a * b : 200
      
    b / a : 2
      
    b % a : 0
      
    a 不等于 b
      注意:

    •   乘号(*)前边必须加反斜杠()才能实现乘法运算。
    •   if...then...fi 是条件语句,后续会有说明。
      关系运算符
      关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
      下面列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
    运算符 说明 举例-eq检测两个数是否相等相等返回 true ( [ $a -eq $b ] 返回 false)    -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/basha=10b=20if [ $a -eq $b ]  then
      echo "$a -eq $b : a 等于 b"
      else
      echo "$a -eq $b: a 不等于 b"
      fi
      if [ $a -ne $b ]
      then
      echo "$a -ne $b: a 不等于 b"
      else
      echo "$a -ne $b : a 等于 b"
      fi
      if [ $a -gt $b ]
      then
      echo "$a -gt $b: a 大于 b"
      else
      echo "$a -gt $b: a 不大于 b"
      fi
      if [ $a -lt $b ]
      then
      echo "$a -lt $b: a 小于 b"
      else
      echo "$a -lt $b: a 不小于 b"
      fi
      if [ $a -ge $b ]
      then
      echo "$a -ge $b: a 大于或等于 b"
      else
      echo "$a -ge $b: a 小于 b"
      fi
      if [ $a -le $b ]
      then
      echo "$a -le $b: a 小于或等于 b"
      else
      echo "$a -le $b: a 大于 b"
      fi
      执行脚本,输出结果如下所示:
    10 -eq 20: a 不等于 b  10 -ne 20: a 不等于 b
      10 -gt 20: a 不大于 b
      10 -lt 20: a 小于 b
      10 -ge 20: a 小于 b
      10 -le 20: a 小于或等于 b
      布尔运算符
      下面列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
    运算符    说明    举例  
    !    非运算,表达式为 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/basha=10b=20if [ $a != $b ]  then
      echo "$a != $b : a 不等于 b"
      else
      echo "$a != $b: a 等于 b"
      fi
      if [ $a -lt 100 -a $b -gt 15 ]
      then
      echo "$a -lt 100 -a $b -gt 15 : 返回 true"
      else
      echo "$a -lt 100 -a $b -gt 15 : 返回 false"
      fi
      if [ $a -lt 100 -o $b -gt 100 ]
      then
      echo "$a -lt 100 -o $b -gt 100 : 返回 true"
      else
      echo "$a -lt 100 -o $b -gt 100 : 返回 false"
      fi
      if [ $a -lt 5 -o $b -gt 100 ]
      then
      echo "$a -lt 100 -o $b -gt 100 : 返回 true"
      else
      echo "$a -lt 100 -o $b -gt 100 : 返回 false"
      fi
      执行脚本,输出结果如下所示:
    10 != 20 : a 不等于 b  10 -lt 100 -a 20 -gt 15 : 返回 true
      10 -lt 100 -o 20 -gt 100 : 返回 true
      10 -lt 100 -o 20 -gt 100 : 返回 false
      逻辑运算符
      以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
    运算符    说明    举例  
    &&    逻辑的 AND    [[ $a -lt 100 && $b -gt 100 ]] 返回 false
      ||    逻辑的 OR    [[ $a -lt 100 || $b -gt 100 ]] 返回 true
      实例
      逻辑运算符实例如下:
    #!/bin/basha=10b=20if [[ $a -lt 100 && $b -gt 100 ]]  then
      echo "返回 true"
      else
      echo "返回 false"
      fi
      if [[ $a -lt 100 || $b -gt 100 ]]
      then
      echo "返回 true"
      else
      echo "返回 false"
      fi
      执行脚本,输出结果如下所示:
    返回 false返回 true  字符串运算符
      下面列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
    运算符说明举例=检测两个字符串是否相等  相等返回 true
      [ $a = $b ] 返回 false
    !=检测两个字符串是否相等  不相等返回 true
      [ $a != $b ] 返回
    -z检测字符串长度是否为0  为0返回 true
      [ -z $a ] 返回 false
    -n检测字符串长度是否为0  不为0返回 true
      [ -n $a ] 返回 true
    str检测字符串是否为空  不为空返回 true
      [ $a ] 返回 true
      实例
    #!/bin/basha="abc"b="efg"if [ $a = $b ]  then
      echo "$a = $b : a 等于 b"
      else
      echo "$a = $b: a 不等于 b"
      fi
      if [ $a != $b ]
      then
      echo "$a != $b : a 不等于 b"
      else
      echo "$a != $b: a 等于 b"
      fi
      if [ -z $a ]
      then
      echo "-z $a : 字符串长度为 0"
      else
      echo "-z $a : 字符串长度不为 0"
      fi
      if [ -n $a ]
      then
      echo "-n $a : 字符串长度不为 0"
      else
      echo "-n $a : 字符串长度为 0"
      fi
      if [ $a ]
      then
      echo "$a : 字符串不为空"
      else
      echo "$a : 字符串为空"
      fi
      执行脚本,输出结果如下所示:
    abc = efg: a 不等于 b  
    abc != efg : a 不等于 b
      -z abc : 字符串长度不为 0
      -n abc : 字符串长度不为 0
      abc : 字符串不为空
      文件测试运算符
      
      文件测试运算符用于检测 Unix 文件的各种属性。
      属性检测描述如下:
    操作符说明举例-b file检测文件是否是块设备文件  如果是,则返回 true
      [ -b $file ] 返回 false
    -c file检测文件是否是字符设备文件  如果是,则返回 true
      [ -c $file ] 返回 false
    -d file检测文件是否是目录  如果是,则返回 true
      [ -d $file ] 返回 false
    -f file检测文件是否是普通文件(既不是目录,也不是设备文件)  如果是,则返回 true
      [ -f $file ] 返回 true
    -g file检测文件是否设置了 SGID 位  如果是,则返回 tru
      e [ -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
      实例
      
      变量 file 表示文件"/var/www/runoob/test.sh",它的大小为100字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:
    #!/bin/bashfile="/var/www/runoob/test.sh"if [ -r $file ]  then
      echo "文件可读"
      else
      echo "文件不可读"
      fi
      if [ -w $file ]
      then
      echo "文件可写"
      else
      echo "文件不可写"
      fi
      if [ -x $file ]
      then
      echo "文件可执行"
      else
      echo "文件不可执行"
      fi
      if [ -f $file ]
      then
      echo "文件为普通文件"
      else
      echo "文件为特殊文件"
      fi
      if [ -d $file ]
      then
      echo "文件是个目录"
      else
      echo "文件不是个目录"
      fi
      if [ -s $file ]
      then
      echo "文件不为空"
      else
      echo "文件为空"
      fi
      if [ -e $file ]
      then
      echo "文件存在"
      else
      echo "文件不存在"
      fi
      执行脚本,输出结果如下所示:
    文件可读  
    文件可写
      
    文件可执行
      
    文件为普通文件
      
    文件不是个目录
      
    文件不为空
      
    文件存在
      echo命令
      Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。
      命令格式:
    echo string  您可以使用echo实现更复杂的输出格式控制。
      1.显示普通字符串:
      
    echo "It is a test"  这里的双引号完全可以省略,以下命令与上面实例效果一致:
    echo It is a test  2.显示转义字符
    echo "\"It is a test\""  结果将是:
    "It is a test"  同样,双引号也可以省略
      3.显示变量
      read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量:
    #!/bin/shread name  
    echo "$name It is a test"
      以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:
    [root@www ~]# sh test.shOK                     #标准输入OK It is a test        #输出  4.显示换行
    echo -e "OK! \n" # -e 开启转义echo "It it a test"  输出结果:
    OK!  

      
    It it a test
      5.显示不换行
    #!/bin/shecho -e "OK! \c" # -e 开启转义 \c 不换行echo "It is a test"  输出结果:
    OK! It is a test  6.显示结果定向至文件
    echo "It is a test" > myfile  7.原样输出字符串,不进行转义或取变量(用单引号)
    echo '$name\"'  输出结果:
    $name\"  8.显示命令执行结果
    echo `date`  结果将显示当前日期
    Thu Jul 24 10:08:46 CST 2014  未完待续......



  • 运维网声明 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.iyunv.com/thread-553634-1-1.html 上篇帖子: 六十七、shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量 下篇帖子: shell整理(43)====shell脚本去重
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

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

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

    扫描微信二维码查看详情

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


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


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


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



    合作伙伴: 青云cloud

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