linux学习

Shell流程控制语句

if选择结构

  • 单分支结构

    # 语法
    if 条件测试
    then 
        命令序列
    fi
    
    # 实例
    [root@www ~]# /root/if1.sh
    #!/bin/bash
    a=45
    b=45
    if [ $a -eq $b ]
      then 
          echo "相等"
      else 
           echo "不相等"
    fi
    [root@www ~]# chmod a+x if1.sh
    [root@www ~]# ./if1.sh 
    相等
  • 双分支结构

    # 语法
    if 条件测试
    then 
        命令序列1
    else 
    命令序列2
    fi
    
    # 实例
    [root@www ~]# vim ping.sh
    #!/bin/bash
    read -p "请输入ip地址" ping
    ping -c 3 -i 0.2 -W 3 $ping &>/dev/null
    if [ $? -eq 0 ]
      then
          echo "Host $ping is up"
    else
      echo "Host $ping is down"
    fi
    [root@www ~]# chmod a+x ping.sh
    [root@www ~]# ./ping.sh 
    请输入ip地址192.168.199.128
    Host 192.168.199.128 is up
  • 多分支结构

    # 语法
    if 条件测试1
    then 
        命令序列1
    elif 条件测试2
    then 
        命令序列2
    else 
    命令序列3
    fi
    
    # 实例
    [root@www ~]# vim grade.sh
    #!/bin/bash
    read -p "请输入成绩(0-100):" fs
    if [ $fs -ge 85 ] && [ $fs -le 100 ]
      then
          echo "$fs 该成绩优秀!"
    elif [ $fs -ge 70 ] && [ $fs -lt 85 ]
      then
          echo "$fs 该成绩良好!"
    elif [ $fs -ge 60 ] && [ $fs -lt 70 ]
      then
          echo "$fs 该成绩合格!"
    else
      echo "$fs 该成绩不合格!"
    fi
    [root@www ~]# chmod a+x grade.sh
    [root@www ~]# ./grade.sh
    请输入成绩(0-100):60
    60 该成绩合格!
    [root@www ~]# ./grade.sh
    请输入成绩(0-100):75
    75 该成绩良好!

循环结构

  • for循环

    # 语法
    for 变量名 in 列表值
    do 
    命令序列
    done
    
    #语法
    for ((初值;条件;布场控制))
    do 
    命令序列
    done
    # 实例1
    [root@www ~]# vim users.txt
    daolang
    huluwa
    fenghuangchuanqi
    zhoujielun
    gouzi
    xioadan
    guidan
    pangxie
    [root@www ~]# vim uaddfor.sh
    #!/bin/bash
    ulist=$(cat /root/users.txt)
    for uname in $ulist
    do
      useradd $uname
      echo "123456" | passwd --stdin $uname &>/dev/null
      chage -d 0 $uname
    done
    [root@www ~]# chmod a+x uaddfor.sh 
    [root@www ~]# . uaddfor.sh 
    
    # 实例2
    [root@www ~]# vim cj.sh
    #!/bin/bash
    for ((i=1;i<=10;i++))
    do
      echo $i
    done
    [root@www ~]# chmod a+x cj.sh
    [root@www ~]# ./cj.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  • while循环

    # 语法
    while 条件测试
    do 
    命令序列
    done
    # 实例
    [root@www ~]# vim uaddwhie.sh
    #!/bin/bash
    prefix="tusr"
    i=1
    while [ $i -le 5 ]
    do
      useradd ${prefix}$i
      echo "123456" | passwd --stdin ${prefix} &>/dev/null
      chage -d 0 ${prefix}$i
      let i++
    done
    [root@www ~]# chmod a+x uaddwhie.sh 
    [root@www ~]# ./uaddwhie.sh 
    [root@www ~]# tail /etc/shadow
    zhoujielun:$6$8E0YVFl9.l7tDe6v$6/yNTPYqZFyZD5JiD24DqsnToDxGr3Mf8pfuFiuGD4JW0oFLeZ8T9Zaz8NXA9abJhM3UcW8LRAjqOaLP7DVGa/:19584:0:99999:7:::
    gouzi:$6$wXQUlP6inbQExWlO$RmdrLtxreLil.fJrIivo4XXvm8kfSIhKUqIvwKsZbhTF9sJ6hldH461xBySs0o.HaAqv7rfXzZSHVNKz9WEvw.:19584:0:99999:7:::
    xioadan:$6$EAzgF3NrGbqPxkwD$2xLz5spkMFLsbZUGtYTuebc2/9JYttPD3aSAoZA4BHcoypcvj3Covaxz1T8TvPQ0BJ31hKtLDoL3VRdl2flCx.:19584:0:99999:7:::
    guidan:$6$QlWNAUX/3UMNHJfd$WRvx0ZSwMRuKTeLUjvruqg7OjN3XvLBpuzhk/ZqHNvpt5QywGSXCzhlz3kC99Q4R9vH.y1RQOY3k.T64TDFSC.:19584:0:99999:7:::
    pangxie:$6$spGyKjoOibu7R.vG$JsTauy5dWNdSeviJlBG7dbm0go.aU9reEVLdAGx7Im.AVYFBitAsnsmsC1faHXrcYVYZoS12uZHbJIaNuFDFX1:19584:0:99999:7:::
    tusr1:!!:0:0:99999:7:::
    tusr2:!!:0:0:99999:7:::
    tusr3:!!:0:0:99999:7:::
    tusr4:!!:0:0:99999:7:::
    tusr5:!!:0:0:99999:7:::

中断控制

  • 中断及退出

    类型 含义
    break 跳出当前所在的循环体,执行循环体后的语句块
    continue 跳过循环体内余下的语句,重新判断条件以决定是否需要执行下一次循环
    exit 退出脚本
    # 实例1
    [root@www ~]# vim breakwhile.sh
    #!/bin/bash
    while read -p "请输入一个数字,0表示退出:" x
    do
      [ $x -eq 0 ] && break
      sum=$[sum+x]
    done
    echo "总和是:$sum "
    [root@www ~]# chmod a+x breakwhile.sh 
    [root@www ~]# ./breakwhile.sh 
    请输入一个数字,0表示退出:45
    请输入一个数字,0表示退出:78
    请输入一个数字,0表示退出:96
    请输入一个数字,0表示退出:56
    请输入一个数字,0表示退出:45
    请输入一个数字,0表示退出:0
    总和是:320 
    
    # 实例2
    [root@www ~]# vim liubei.sh
    #!/bin/bash
    i=0
    while [ $i -le 20 ]
    do
      let i++
      [ $[i%6] -ne 0 ] && continue
      sleep 1
      echo $i的平方为:$[i*i]
    done
    [root@www ~]# chmod a+x liubei.sh 
    [root@www ~]# ./liubei.sh 
    6的平方为:36
    12的平方为:144
    18的平方为:324
    
    # 实例3
    [root@www ~]# vim exit.sh
    #!/bin/bash
    if [ $# -ne 2 ]
      then
          echo "用法:$0 num1 num2"
          exit 10
    fi
    expr $1 + $2
    exit 0
    [root@www ~]# chmod a+x exit.sh
    [root@www ~]# ./exit.sh
    用法:./exit.sh num1 num2
    [root@www ~]# ./exit.sh 1 1
    2
    [root@www ~]# echo $?
    0

case语句

  • case分支结构

    # 语法
    case 变量值 in
    模式1)
    命令序列1;;
    模式2)
    命令序列2;;
    ...
    *)    
    默认命令序列
    esac
    # 实例1
    [root@www ~]# vim key.sh
    #!/bin/bash
    case $1 in
    redhat)
      echo "fedora"   ;;
    fedora)
      echo "redhat"   ;;
    *)
      echo "脚本用法为:$0 {redhat|fedora}";;
    esac
    [root@www ~]# chmod a+x key.sh 
    [root@www ~]# ./key.sh 
    脚本用法为:./key.sh {redhat|fedora}
    [root@www ~]# ./key.sh redhat
    fedora
    [root@www ~]# ./key.sh fedora
    redhat
    
    # 实例2
    [root@www ~]# vim casetest.sh
    #!/bin/bash
    case $1 in
    t)
      touch $2;;
    m)
      mkdir $2;;
    r)
      rm -rf $2;;
    *)
      echo "脚本的用法为:$0 操作类型(t,m,r) 目标对象(路径)";;
    esac
    [root@www ~]# chmod a+x casetest.sh 
    [root@www ~]# ./casetest.sh 
    脚本的用法为:./casetest.sh 操作类型(t,m,r) 目标对象(路径)
    [root@www ~]# ./casetest.sh t lumu
    [root@www ~]# ls -l lumu
    -rw-r--r-- 1 root root 0 8月  15 15:32 lumu
    [root@www ~]# ./casetest.sh r lumu
    [root@www ~]# ls -l lumu
    ls: 无法访问'lumu': 没有那个文件或目录

字符串处理

  • 字符串截取

    # 格式: ${var:起始位置:长度},其中起始位置编号从0开始,可省略
    # 实例1
    [root@www ~]# echo ${nm:0:6}
    Tarena
    [root@www ~]# nm_sub=${nm:0:6}
    [root@www ~]# echo $nm_sub
    Tarena
    
    # 实例2  生成八位随机密码
    [root@www ~]# vim mima.sh
    #n=$[RANDOM%62]
    #p=${x:n:1}
    pass=
    for i in {1..8}
    do
      n=$[RANDOM%62]
      p=${x:n:1}
      pass+=$p
    done
    echo $pass
    [root@www ~]# chmod a+x mima.sh
    [root@www ~]# ./mima.sh
    h0dYF7Jd
  • 字符串替换

    # 只替换第一个匹配结果  格式: ${var/old/new}
    # 替换全部匹配结果    格式: ${var//old/new}
    # 实例 
    [root@www ~]# echo $nm
    Tarena IT Group
    [root@www ~]# echo ${nm/a/##}
    T##rena IT Group
    [root@www ~]# echo ${nm//a/##}
    T##ren## IT Group
  • 按条件掐头去尾

    • 字符串掐头
    # 从左向右,最短(即第一个)匹配删除,格式: ${变量名#*关键字}
    # 从左向右,最长匹配删除,格式: ${变量名##*关键字}
    # 实例
    [root@www ~]# mkdir="/var/spool/mail/root"
    [root@www ~]# echo ${mkdir#*/}
    var/spool/mail/root
    [root@www ~]# echo ${mkdir##*/}
    root
    • 字符串去尾
    # 从右向左,最短匹配删除,格式: ${变量名%关键字*}
    # 从右向左,最长匹配删除,格式: ${变量名%%关键字*}
    # 实例
    [root@www ~]# mkdir="/var/spool/mail/root"
    [root@www ~]# echo ${mkdir%o*}
    /var/spool/mail/ro
    [root@www ~]# echo ${mkdir%%o*}
    /var/sp
    # 实例   更改文件后缀名
    [root@www zilong]# touch {1,2,3,4,5,6,7,8,9}.doc
    [root@www zilong]# ls
    1.doc  2.doc  3.doc  4.doc  5.doc  6.doc  7.doc  8.doc  9.doc
    [root@www zilong]# vim renfile.sh
    #!/bin/bash
    for i in $(ls *.doc)
    do
      mv $i ${i%.doc*}.txt
    done
    [root@www zilong]# chmod a+x renfile.sh 
    [root@www zilong]# ./renfile.sh 
    [root@www zilong]# ls
    1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt  renfile.sh
  • 变量初始值处理

    # 格式: ${var:-word}
    --若变量var已存在非null,则返回$var的值
    --否则返回字符串"word",变量var值不变
    # 实例
    [root@www ~]# nm="Tarena IT Group"
    [root@www ~]# echo ${nm:-Tarena}
    Tarena IT Group
    [root@www ~]# unset nm
    [root@www ~]# echo ${nm:-"这个变量没有设置"}
    这个变量没有设置

一条评论

回复 匿名 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注