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
          ...
    以上执行输出的时候:当条件为否的时候进入循环,是一个死循环,一直输出上面结果
    

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

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

推荐阅读更多精彩内容

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