Shell脚本语言学习二

Shell脚本语言学习一
Shell脚本语言学习三


Shell脚本语言 echo命令?
  • 显示普通字符串

    脚本代码:
          echo "iPhone X 标配 8388元"
    终端执行输出:
          iPhone X 标配 8388元
    
  • 显示转义字符

    脚本代码:       
          echo "\"iPhone X 顶配 9688元\""
    终端执行输出:
          "iPhone X 顶配 9688元"
    
  • 显示变量

    脚本代码:
          iPhone="iPhone X"
          echo ${iPhone} 9688
    终端执行输出:
          iPhone X 9688
    
  • 显示换行

    错误脚本代码:
          echo "iPhone X \n hello world!"
    终端执行输出:
          iPhone X \n hello world!
    
    正确脚本代码:
          echo -e "iPhone X \n hello world!"
    终端执行输出:
          iPhone X 
           hello world!
    
    说明:  -e: 表示开启转义功能.
    
  • 不换行

    脚本代码一:(换行)
          echo "iPhone X hello"
          echo "world!"
    终端执行输出:
          iPhone X hello 
          world!
    
    脚本代码二:(不换行)
          echo -e "iPhone X hello \c "
          echo "world!"
    终端执行输出:
          iPhone X hello world!
    
    注意: -e: 表示开启转义功能,但是 \c 表示不换行.
    
  • 显示一个执行命令

    要求: 输出当前时间,还有很多命令后面学习.
    脚本代码:
          echo `date` 
    终端执行输出:
          2017年11月21日 星期二 16时20分43秒 CST
    
  • 退出命令

    语法: exit 状态->退出程序
    脚本代码一:
          iPhone="买了一台iPhone X,摔爆了"
          echo ${iPhone}
          exit
          echo "哈哈,谁让你不小心..."
    终端执行输出:(后面没有输出了,直接退出了)
          买了一台iPhone X,摔爆了
    
    脚本代码二:
          iPhone="买了一台iPhone X,摔爆了"
          echo ${iPhone}
          exit 0
          echo "哈哈,谁让你不小心..."
    终端执行输出:(结果同上)
    

Shell脚本语言 数组 ?
  • 语法
    数组名=(值1 值2 值3...)
  • 初始化数组

    脚本代码一:
          name=("小明" "18" "全班最菜")
          echo $name
    终端执行输出:(默认打印第一个元素)
          小明
    
    脚本代码二:
          name=()
          name[0]="小明"
          name[1]="Andy"
          name[2]="Jim"
          name[3]="最菜排名"
          echo ${name[1]} ${name[2]}
    终端执行输出:
          Andy Jim
    
  • 读取数组元素

    语法结构:${数组名[下标]}
    脚本代码:
          name=("小明" "18" "全班最菜")
          echo ${name[1]}
    终端执行输出:
          18
    
    输出所有:"@"表示输出数组中所有的数据
    脚本代码:
          name=("小明" "18" "全班最菜")
          echo ${name[@]}
    终端执行输出:
          小明 18 全班最菜
    
  • 获取数组长度

    获取数组元素个数语法一: ${#数组名[@]}
    脚本代码: 
          name=("小明" "18" "全班最菜")
          echo ${#name[@]}
    终端执行输出:
          3
    
    获取数组元素个数语法二: ${#数组名[*]}
    脚本代码:
          name=("小明" "18" "全班最菜")
          echo ${#name[*]}
    终端执行输出:
          3
    
  • 获取单个元素字符长度

    语法:${#数组名[下标]}
    脚本代码:
          name=("小明" "18" "全班最菜")
          echo ${#name[2]}
    终端执行输出:
          4
    

Shell脚本语言 参数传递 ?
  • 语法定义

    ./文件名.sh 参数一 参数二 参数3 ...
    
  • 案例需求

    脚本代码:
          echo ${0} ${1}  ${2}
    终端执行命令:
          /shell.sh 豆你玩 蒜你狠
    终端执行输出:
          ./shell.sh 豆你玩 蒜你狠
    解释说明:
          ${0} -> 表示文件名称
          ${1} -> 表示参数1
          ${2} -> 表示参数2
    
  • 特殊字符

    • $#: 表示获取脚本输入参数的个数

      脚本代码:
            echo ${#}
      终端执行代命令:
            ./shell.sh 豆你玩 蒜你狠
      终端执行输出:
            2 
      
    • $*: 表示显示整个脚本输入的参数列表

      脚本代码:
            echo ${*}
      终端执行命令:
            ./shell.sh 豆你玩 蒜你狠
      终端执行输出:
            豆你玩 蒜你狠
      

Shell脚本语言 基本运算符 ?
  • 算术运算符->加减乘除等

    • +运送

      注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错.
      脚本代码:
            a=8388
            b=9688
            c=`expr $a + $b`
            echo c的值是: $c
      终端执行输出:
            c的值是: 18076
      
    • - 运算

      注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错.
      脚本代码:
           a=8388
           b=9688
           c=`expr $a - $b`
           echo "c的值是: $c"
      终端执行输出:
           c的值是: -1300
      
    • * 号运算

      注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错.
           * 号需要转义一下
      脚本代码:    
           a=8388
           b=9688
           c=`expr $a \* $b`
           echo "c的值是: $c"
      终端执行输出:
           c的值是: 81262944
      
    • /运算

      注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错.
            ' / ' 只记整数部分,忽略小数部分
      脚本代码:    
           a=8388
           b=9688
           c=`expr $a / $b`
           echo "c的值是: $c"
      终端执行输出:
           c的值是: 0
      
    • %运算

      注意: 'expr' 规定命令,并且规定命令后边和运算符两边都要有空格,否则会被当成字符串处理或者报错.
      脚本代码:    
           a=8388
           b=9688
           c=`expr $a % $b`
           echo "c的值是: $c"
      终端执行输出:
           c的值是: 8388
      
    • = 运算

      脚本代码:    
           a=8388
           b=$a
           echo "b的值是: $b"
      终端执行输出:
           b的值是: 8388
      
    • == 运算

      注意: `[ ]` 内部要和变量之间以及`==`运算符和变量之间都要有空格,否则会报错.
      脚本代码:    
            a=8388
            b=9688
            if [ $a == $b ]
            then
                 echo "a等于b"
            else
                 echo "a不等于b"
            fi
      终端执行输出:
            a不等于b
      
  • 关系运算符

    • -eq : 检测两个数是否相等,当相等时返回 true

      脚本代码:
            c=999
            d=999
            if [ $c -eq $d ]
            then
                 echo "c等于d"
            else
                 echo "c不等于d"
            fi
      终端执行输出:
            c等于d
      
    • -ne 检测两个数是否相等,不相等返回 true

      脚本代码:
            c=999
            d=999
            if [ $c -ne $d ]
            then
                 echo "c不等于d"
            else
                 echo "c等于d"
            fi
      终端执行输出:
            c不等于d  
      
    • -gt 检测左边数是否大于右边,如果是,返回true

      脚本代码:
            c=100
            d=200
            if [ $c -gt $d ]
            then
                 echo "c大于d"
            else
                 echo "c不大于d"
            fi
      终端执行输出:
            c大于d  
      
    • -It 检测左边数是否小于右边数,如果是,返回true

      脚本代码:
            c=100
            d=200
            if [ $c -lt $d ]
            then
                 echo "c小于d"
            else
                 echo "c不小于d"
            fi
      终端执行输出:
            c小于d  
      
    • -ge 检测左边数是否大于等于(大于+等于)右边数,如果是,返回true.

      脚本代码:
            c=1000
            d=200
            if [ $c -ge $d ]
            then
                 echo "c大于等于d"
            else
                 echo "c小于d"
            fi
      终端执行输出:
            c大于等于d  
      
    • le 检测左边数是否小于等于右边数,如果是,返回true.

      脚本代码:
            c=100
            d=200
            if [ $c -le $d ]
            then
                 echo "c小于等于d"
            else
                 echo "c大于d"
            fi
      终端执行输出:
            c小于等于d  
      
  • 布尔值运算符

    • -o 或运算,有一个表达式为true,则返回true.

      脚本代码:
            a=100
            b=200
            if [ $a -lt 200 -o $b -gt 200 ]
            then
                echo "成立"
            else
                echo "不等于"
            fi
      终端执行输出:
            成立
      
    • -a 与运算,两个表达式都是true,则返回true

      脚本代码:
            a=199
            b=201
            if [ $a -lt 200 -a $b -gt 200 ]
            then
                echo "成立"
            else
                echo "不等于"
            fi
      终端执行输出:
            成立
      
    • ! 非运算, 表达式为false,加上!运算则返回true,否则返回false.

      脚本代码:
            a=100
            b=200
            if [ $a != $b ]
            then
                echo "a不等于b"
            else
                echo "a等于b"
            fi
      终端执行输出:
            a不等于b
      
  • 逻辑运算符

    • && 逻辑且 -> 相当于 and 的意思

      脚本代码:
            a=199
            b=201
            if [ $a -lt 200 ] && [ $b -gt 200 ]
            then
                echo "成立"
            else
                echo "不成立"
            fi
      终端执行输出:
            成立
      
    • || 逻辑或 -> 相当于 or 的意思

      脚本代码:
            a=199
            b=201
            if [ $a -lt 199 ] || [ $b -gt 200 ]
            then
                echo "成立"
            else
                echo "不成立"
            fi
      终端执行输出:
            成立
      
  • 字符串运算

    • = 检测两个字符串是否相等,如果相等,返回true.

      脚本代码:
            a="hehe"
            b="hehe"
            if [ $a = $b ]
            then
                echo "字符串a 等于 字符串b"
            else
                echo "字符串a 不等于 字符串b"
            fi
      终端执行输出:
            字符串a 等于 字符串b
      
    • != 检测两个字符串是否相等, 如果不相等,返回 true.

      脚本代码:
            a="hehe"
            b="hehe"
            if [ $a != $b ]
            then
                echo "字符串a 不等于 字符串b"
            else
                echo "字符串a 等于 字符串b"
            fi
      终端执行输出:
            字符串a 等于 字符串b
      
    • -z 检测字符串长度是否为0, 如果是 返回true

      脚本代码:
            a="hehe"
            if [ -z $a ]
            then
                echo "a为空,不存在"
            else
                echo "a存在值"
            fi
      终端执行输出:
            a存在值
      
    • -n 检测字符串长度是否为0, 如果不是 返回true

      脚本代码:
            a="hehe"
            if [ -n "$a" ]
            then
                echo "a存在值"
            else
                echo "a不存在值"
            fi
      终端执行输出:
            a存在值
      注意: if 后中括号判断条件 $a 两边必须加了双引号 "$a",否则代码有问题
      
    • 字符串 检测字符串是否为空, 不为空 返回true

      脚本代码:
            a="hehe"
            if [ $a ]
            then
                echo "a不为空"
            else
                echo "a为空"
            fi
      终端执行结果:
            a不为空
      
  • 文件测试运算符

    • -d file检测文件是不是一个目录,如果是,那么返回true.

      脚本代码:
      file="/Users/junde/Desktop/shell.sh"
      if [ -d $file ]
      then
          echo "是一个目录"
      else
          echo "不是一个目录"
      fi
      终端执行输出:
            不是一个目录
      
    • -r file 检测文件是否可读,如果是 返回true

      脚本代码:
            file="/Users/junde/Desktop/shell.sh"
            if [ -r $file ]
            then 
                echo "文件可读"
            else
                echo "文件不可读"
            fi
      终端执行输出:
            文件可读
      
    • -w file 检测文件是否可写

      脚本代码:
            file="/Users/junde/Desktop/shell.sh"
            if [ -w $file ]
            then 
                echo "文件可写"
            else
                echo "文件不可写"
            fi
      终端执行输出:
            文件可写
      
    • x file 检测文件是否是可执行文件,如果是 返回true

      脚本代码:
            file="/Users/junde/Desktop/shell.sh"
            if [ -x $file ]
            then 
                echo "文件可执行"
            else
                echo "文件不可执行"
            fi
      终端执行输出:
            文件可执行
      
    • -f file 检测文件是否是一个普通文件(既不是目录,也不是设备文件),如果是,那么返回true

      脚本代码:
            file="/Users/junde/Desktop/shell.sh"
            if [ -f $file ]
            then 
                echo "文件为普通文件"
            else
                echo "文件为特殊文件"
            fi
      终端执行输出:
            文件为特殊文件
      
    • -s file 检测文件内部是否有内容,如果有内容 返回true

      创建一个空文本测试文件 `test.text`
      脚本代码:
            file="/Users/junde/Desktop/test.text"
            if [ -s $file ]
            then 
                echo "文件有内容"
            else
                echo "文件没有内容"
            fi
      终端执行输出:
            文件没有内容
      
    • -e file 检测文件是否存在(包含了:目录和文件), 如果是 返回true

      脚本代码:
            file="/Users/junde/Desktop/shell.sh"
            if [ -e $file ]
            then 
                echo "存在"
            else
                echo "不存在"
            fi
      终端执行输出:
            存在
      

Shell脚本语言 流程控制 ?
  • if 语句

    语法结构:
          if [条件]
          then
              代码
          else
              代码
          fi
     脚本代码: 参照本文上面的例子即可
    
  • if else 语句的多种选择条件

    语法结构:
          if [条件]
          then
             代码
          elif [条件]
          then
             代码
          else
               代码
          fi
    
     脚本代码:
            a=99
            b=100
            if [ $a = $b ]
            then
                echo "a的值等于b"
            elif [ $a ]
            then
                echo "$a"
            else
                echo "其他"
            fi
      终端执行输出:
            99
    
  • for 循环语句

    语法结构:
        for 变量名 in item1 item2 item3 ...
        do
            代码
        done
    
    案例一: 简单的读取值
    脚本代码:
        for num in 1 9 8 8 0 9
        do 
            echo ${num}
        done
    终端执行输出:
        1
        9
        8
        8
        0
        9
    
    案例二: 读取列表复杂值 -> 注意特殊字符需要转义
    脚本代码:(错误代码)
        for name in "I don't know"
        do 
            echo ${name}
        done  
    终端执行输出:
        I don't know
    这种直接输出字符串,不会输出单个单词
    
    脚本代码:(正确代码)
        for name in I don\' t know
        do 
            echo ${name}
        done  
    终端执行输出:
        I
        don't
        know
    
    案例三: 从变量读取里列表
    脚本代码:
        var="I don't know"
        for name in ${var}
        do 
            echo ${name}
        done  
    终端执行输出:
        I
        don't
        know
    
    案例四: 读取目录 -> 通配符
    脚本代码:
        file="/Users/junde/Desktop/*"
        for name in ${file}
        do
             echo ${name}
        done
    终端执行输出: (太多了暂时省略一部分)
        /Users/junde/Desktop/Shell
        /Users/junde/Desktop/SwiftDemo
        /Users/junde/Desktop/YHPhotoBrowser
    
    案例五: 嵌套循环(类似C语言写法)
    脚本代码一:(普通循环)
        for ((a = 1; a < 5; a++))
        do
             echo ${a}
        done
    终端执行输出:
        1
        2
        3
        4
    
    脚本代码二:(嵌套循环)
        for ((a = 1; a < 5; a++))
        do
             echo a\-\>${a}
             for ((b = 1; b < 5; b++))
             do
                echo "b-->${b}"
             done
        done
    终端执行输出:
        a->1
        b-->1
        b-->2
        a->2
        b-->1
        b-->2
        a->3
        b-->1
        b-->2
    
    脚本代码三: (无限循环)
        c=1
        for ((;;))
        do
           echo $c
           c=`expr $c + 1`
        done
    终端执行输出:(省略...)
        1
        2
        .
        .
        .
    
  • while 循环

    语法结构:
        while (条件)
        do 
            代码
        done
    
    脚本代码一: (基本循环)
        c=1
        while(($c<5))
        do
           echo $c
           c=`expr $c + 1`
        done
    终端执行输出:
        1
        2
        3
        4
    
    脚本代码二: (无限循环)
        c=1
        while :
        do
           echo $c
           c=`expr $c + 1`
        done
    终端执行输出:(省略...)
        1
        2
        .
        .
        .
    
  • case 语句

    语法结构:
        case 值 in
        模式1)
             代码
        ;;
        模式2)
             代码
        ;;
        模式3)
             代码
        ;;
        sac
    
    脚本代码:
         number=1
         case $number in
         1)
             echo "等于1"
         ;;
         2)
             echo "等于2"
         ;;
         3)
             echo "等于3"
         ;;
         esac
    终端执行输出:
         等于1
    
  • until循环?

    语法结构:(当条件为否的时候进入逻辑代码,无限循环)
          until 条件
          do
              逻辑代码
          done
    脚本代码:
           a=1
           until (($a > 1))
           do
               echo "i的值为 $a 小于等于1"
           done
    终端执行输出:
          a的值为 1 小于等于1
          a的值为 1 小于等于1
          a的值为 1 小于等于1
          ...
    以上执行输出的时候:当条件为否的时候进入循环,是一个死循环,一直输出上面结果
    

如果上述有错误的地方,敬请告知,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 自己写编译动态库脚本文件,脚本语言去操作数据库,插入数据,删除数据,修改数据等等... 内容一:Shell脚本语言...
    Jackey_song阅读 660评论 0 3
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,792评论 0 11
  • 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shel...
    某人在阅读 2,028评论 0 0
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,127评论 0 0
  • 基础 头文件 #!/bin/bash 或者#!/bin/sh #!约定的标记,如IOS的Import 执行文件时需...
    ZMJun阅读 1,257评论 1 2