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:-"这个变量没有设置"} 这个变量没有设置
一条评论
匿名
内容比较详细