工具篇-shell脚本编程快速入门(over)

参考:《shell脚本-菜鸟教程》

1 流程控制语句

1.1 if语句

  • 语法1(if)

    if condition
    then
        command1 
        command2
        ...
    fi
    #写成一行
    if [condition]; then command; fi
    
    ######### 解释 ###########
    # if 代表判断开始
    #
    # fi 代表整个if语句结束
    ######### 结束 ########### 
    
    
  • 语法2(if else)

    if condition
    then
        command1 
        command2
        ...
    else
        command
    fi
    
  • 语法3(if else-if else)

    if condition
    then
        command1
    elif condition2
    then 
        command
    else
        command
    fi
    #具体等后面学到运算符再细讲
    

2 运算符

在shell中运算符分为以下几种:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件运算符

注意:

原生的bash是不支持数学运算的,所以我们需要借助其他的命令帮助我们去执行,最常用的就是expr,这是一款表达式计算工具,可以帮助我们去完成求值操作。例如:

image-20200615161658392

从图中可知 两数相加 运算符中间必须要有空格,否则无法计算

2.1 算数运算符

  • 说明

    运算符 说明
    + 加法
    - 减法
    * 乘法(注意:*在脚本里面是通配符,所以在使用时需要转义)
    / 除法
    % 取余
    = 赋值
    == 相等。两个数字进行相比,相等为true,不等false
    != 不相等 两个数字相比 不等为true,相等为false
  • 案例

    #!/bin/bash
    a=10;
    b=20;
    echo "a + b = $result"
    
    # 减法
    result=`expr $a - $b`;
    echo "a - b = $result"
    
    # 乘法
    result=`expr $a \* $b`
    echo "a * b = $result"
    
    # 除法
    result=`expr $a / $b`
    echo "a / b = $result"
    
    # 取余
    result=`expr $a % $b`
    echo "a % b = $result"
    
    #赋值
    re=$result
    echo "赋值: $re"
    
    #赋值
    re=$result
    echo "赋值: $re"
    
    ############# 解释 ##################################################################
    #
    #   判断 == 必须用[] 包裹起来 且比较符之间必须要有空格  
    #   这种写法[$a==$b]是错误的
    #   这种写法[ $a== $b ]是正确的
    #   这种比较只能放在流程控制语句种,如果把[$a == $b]赋值给一个变量或者输出,得不到想要的结果
    #
    #    if和条件之间必须要有 空格 
    #    当if条件结束时 必须写上fi,代表fi结束
    #
    ######################################################################################
    if [ $a == $b ]
    then
      echo 'a 等于b'
    else
      echo 'a 不等于 b'
    fi
    
    if [ $a != $b ]
    then    
      echo "a !=b"
    else
      echo "a == b"
    fi
    

    执行结果如下:

    image-20200615170111497

2.2 关系运算符

  • 简介

    关系运算符只支持数字和字符串为纯数字的字符串

    运算符 说明
    -eq 等于; 两个数比较,相等返回true,不等返回false
    -ne 不等于;两个数比较 不等返回true ,相等返回false
    -gt 大于;两个数比较,左边的数据大于右边边的数据 返回true,否则返回false
    -lt 小于;两个数比较,左边的数大于右边的数返回false,否则返回true
    -ge 大于等于;两个数比较,左边的数大于或者等于右边的数 返回true,否则返回false
    -le 小于等于;两个数比较 左边的的小于或者等于右边的数 返回true 否则返回false
  • 案例

    #!/bin/bash
    a=20
    c=10
    
    # -eq等于
    if [ $a -eq $c ]
    then
       echo 'a -eq c : a 等于 c'
    else
      echo "a -eq c : a 不等于 c"
    fi
    
    #-ne 不等于
    if [ $a -ne $c ]
    then
       echo 'a -ne c : a 不等于 c'
    else
       echo "a -ne c : a 等于 c"fi
    # -gt 大于
    if [ $a -gt $c ]
    then
      echo "a -gt c: a大于c"
    else
      echo "a -gt c:  a 小于c"
    fi
    
    # -lt 小于
    if [ $a -lt $c ]
    then
      echo "a -lt c: a大于c"
    else
      echo "a -lt c:  a 小于c"
    fi 
    # -ge 大于等于
    if [ $a -ge $c ]
    then
      echo "a -ge c: a大于等于c"
    else
      echo "a -ge c:  a 小于等于 c"
    fi
    
    # -le 小于等于
    if [ $a -le $c ]
    then
      echo "a -le c: a大于等于c"
    else
      echo "a -le c:  a 小于等于 c"
    fi
    

    执行脚本

    image-20200615201717370

2.3 逻辑运算符

对布尔结果进行计算

运算符 说明
! 对布尔结果取反,如果结果为true,取反结果为false
-a 与 左右边结果都为true,整个结果为true
-o 只要一个结果为true,整个结果为true
&& 如果左边结果为false,就不会执行右边,直接整个结果为false
|| 如果左边为true,就不会执行右边,直接整个结果为true

案例

#!/bin/bash
a=13
b=14

# 取反 符号与表达式之间要有空格
if [ ! $a -gt $b ]
then
  echo "对 $a -gt $b 结果取反"
fi

#-a 与运算,即使左边结果为false,也会计算右边
if [ $a -lt 20 -a $a != 100 ]
then
 echo "-a 与运算"
fi

#-o 或运算 即使左边结果为true也会再去计算右边
if [ $a -lt 20 -o $a -gt $b ]
then
echo "-o 与运算"
fi

#&& 逻辑与运算 如果左边结果为false,整个结果为false,不会再去计算右边,只有当左边结果为true时才会计算右边
# 必须用双中括号包裹起来
if [[ $a -lt $b && $b != 100 ]]
then
   echo "逻辑与运算"
fi

#|| 逻辑||运算 如果左边结果为true,整个结果为true,不会再去计算右边,只有当左边结果为false时才会计算右边
# 必须用双中括号包裹起来
if [[ $a -lt $b || $b != 100 ]]
then
   echo "逻辑或运算"
fi

结果如下:

image-20200615212155396

2.4 字符串运算符

对字符串进行逻辑判断。

逻辑表达式 说明
= 用来比较两个字符串,如果字符串相等返回true,否则返回false
!= 用来比较两个字符串,如果不等返回true,相等返回false
-z 用来检测字符串长度是否为0,为0返回ture,不为0返回falses
-n 用来检测字符串长度,如果长度不为0返回true,否则返回false
$ 用来检测字符串是否为空,不为空返回true

案例

#!/bin/bash
a="lisi"
b=""
c="wangwu"

echo "a 字符串内容为:$a"
echo "b 字符串内容为:$b"
echo "c 字符串内容为:$c"

if [ $c = $a ]
then
  echo "a 与 c比较  不等" 
else
  echo "a 与 c比较 相等"
fi


if [ $a != $c ]
then
  echo "a 与 c比较  不等" 
else
  echo "a 与 c比较 相等"
fi

if [ -z $b ]
then
  echo "b 的字符串长度为0"
else
  echo "b 的字符串长度不为0"
fi


#要用 双引号包裹起来
if [-n "$c" ]
then
  echo "c 的字符串长度不为0"
else
  echo "c 的字符串长度为0"
fi

if [ $b ]
then
  echo "b字符串内容为空"
else
  echo "b的字符串不为空"
fi

结果如下:

image-20200623093536521

2.5 文件操作符

在linux中,一切皆文件,因此我们可以对进行进行一些逻辑操作

符号 说明
-b 检测是否为块设备(u盘,硬盘)文件,如果是 返回true,否则返回fals(这个不怎么常用,了解即可)
-c 用来检测是否为字符设备(键盘,打印机)文件,如果是返回true,否则返回false(不怎么常用,了解即可)
-d 用来检测文件是否为目录,如果是返回true,否则返回false
-f 用来检测文件是否为普通文件,如果是返回true,否则返回false
-r 用来检测文件是否可读,可读返回true,否则返回false
-w 用来检测文件是否可写,可读返回true,否则返回false
-x 用来检测文件是否可执行,可执行返回true,否则返回false
-s 用来检测文件是否为空,主要是是看文件大小是否为0,是返回true,不是返回false
-e 用来检测文件(目录)是否存在,如果存在返回true,不存在返回false

案例:

#!/bin/bash
path="./test1.sh"
echo "文件地址: $path"

if [ -b $path ] 
then
  echo "当前文件是块设备文件"
else
 echo "当前文件不是块设备文件"
fi

if [ -c $path ] 
then
  echo "当前文件是块字符设备文件"
else
 echo "当前文件不是字符设备文件"
fi

if [ -d $path ] 
then
  echo "当前文件是目录文件"
else
 echo "当前文件不是目录文件"
fi

if [ -f $path ] 
then
  echo "当前文件是普通文件"
else
 echo "当前文件不是普通文件"
fi

if [ -r $path ] 
then
  echo "当前文件是可读文件"
else
 echo "当前文件不是可读文件"
fi

if [ -w $path ] 
then
  echo "当前文件可写"
else
 echo "当前文件不可写"
fi

if [ -x $path ] 
then
  echo "当前文件是可执行文件"
else
 echo "当前文件不是可执行文件"
fi

if [ -s $path ] 
then
  echo "当前文件是不为空"
else
 echo "当前文件为空"
fi

if [ -b $path ] 
then
  echo "当前文件存在"
else
 echo "当前文件不存在"
fi

结果如下:

image-20200623101940456

3 循环

3.1 for循环

  • 语法

    for loop in item1 item2 ...
    do
      code1...
      code2...
    done
    
    或者
    
  • 案例1

    #!/bin/bash
    for loop in 1 5 6 7 8 89
    do      
      echo "循环的数据为 $loop"
    done      
    

    结果为:

    image-20200623104611442
  • 案例2

    #!/bin/bash
    arr=(1 7 8 99)
    for loop in ${arr[@]}
    do
      echo "循环的数据为 $loop"
    done
    
    image-20200623105142489

3.2 while循环

  • 语法

    while 条件
    do
      code1
      code2
      ...
    done
    
  • 案例1

    #/bin/bash
    num=1
    #需要两个括号把条件包裹起来
    while(($num < 5))
    do
       echo "每次循环的数据为:$num"
    # let 这个是linux自带的一个变量计算的一个命令
       let "num++"
    done
    
    image-20200623105833943
  • 案例2

    #/bin/bash
    num=0
    arr=("lisi" 5 7)
    #获取数组长度
    length=${#arr[@]}
    while(($num < length ))
    do
       echo "每次循环的数据为:${arr[num]}"
    # let 这个是linux自带的一个变量计算的一个命令
       let "num++"
    done
    
    image-20200623110134096

3.3 死循环

for((;;))
或者
while true
do
    code
    code
    ...
done

3.4 跳出循环

  • 简介

    • break 跳出循环
    • continue 跳出本次循环
  • break案例

    #/bin/bash
    num=0
    arr=("lisi" 5 7)
    #获取数组长度
    length=${#arr[@]}
    while(($num < length ))
    do
       echo "每次循环的数据为:${arr[num]}"
       break
    # let 这个是linux自带的一个变量计算的一个命令
       let "num++"
    done
    
    image-20200623110615921
  • continue 案例

    #/bin/bash
    num=0
    arr=("lisi" 5 7)
    #获取数组长度
    length=${#arr[@]}
    while(($num < length ))
    do
       echo "每次循环的数据为:${arr[num]}"
       # let 这个是linux自带的一个变量计算的一个命令
       let "num++"
       continue
    done
    
    image-20200623110805579

你可能感兴趣的:(工具篇-shell脚本编程快速入门(over))