工具篇-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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容