shell多分支与case语句和循环
语法介绍
# 单if语法
'适用范围:只需要一步判断,条件返回真干什么'
## 案例
if [ condition ] # condition 值为true or false
then # 条件为真的时候执行
commands # 代码块 一行或者多行代码
fi # 语句的结束
## 翻译
假如 条件为真
那么
执行commands代码块
结束
# if…else语句
'适用范围==:两步判断,条件为真干什么,条件为假干什么'
## 案例
if [ condition ]
then # 条件为真
commands1 # 真 要执行代码块
else # 条件为假
commands2 # 假 要执行的代码块
fi # 结束
## 翻译
假如条件为真
那么
执行commands1代码块
否则
执行commands2代码块
结束
# if…elif…else语句
'适用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件'
## 案例
if [ condition1 ]; then
# 如果 condition1 为真,执行这里,然后跳过所有 elif 和 else
command1
elif [ condition2 ]; then
# 只有 condition1 为假时,才会检查 condition2
# 如果 condition2 为真,执行这里,然后跳过 else
command2
else
# 只有所有条件都为假时,才会执行这里
commandX
fi
## 翻译
假如 条件1 为真
那么
执行代码块1
假如 条件2 为真
那么
执行代码块2
以此类推的N个条件及对应的执行代码块
否则 【以上所有条件中没有一个满足的】
执行代码块X
结束
# if嵌套if
'当有多步判断的时候,可以使用if嵌套'
## 案例
if [ $1 -ne $2 ]
then
if [ $1 -gt $2 ]
then
echo " $1 > $2 "
else
echo " $1 < $2 "
fi
else
echo " $1 = $2 "
fi
# if高级用法
## 案例1
'条件符号使用双圆括号,可以在条件中植入数学表达式 if (())'
if (( (5+5-5)*5/5 > 10 ))
then
echo "yes"
else
echo "no"
fi
## 案例2
'使用双方括号,可以在条件中使用通配符'
for var in ab ac rx bx rvv vt
do
if [[ "$var" == r* ]]
then
echo "$var"
fi
done
# 简写if
## 案例1
if [ ! -d /tmp/baism ]
then
mkdir /tmp/baism
fi
## 可以简写为
[ ! -d /tmp/baism ] && mkdir /tmp/baism
## 案例2
if [ $USER == 'root' ]
then
echo "hello root"
else
echo "hello guest"
fi
## 可以简写为
[ $USER == 'root' ]&&echo "hello root" || echo "hello guest"if-elif-else(并列关系)
多个条件是互斥的,只执行第一个满足的,然后退出。
if嵌套if(层级关系)
多个条件是递进的,外层条件满足后,才检查内层条件。内外层都满足才会执行内层代码。
条件循环语句-case
case介绍
特点:根据给予的不同条件执行不同的代码块
# 介绍
# 执行完匹配的分支后,跳到 esac 后面继续执行
case $var in
pattern 1)
# 如果 $var 匹配 pattern1,执行这里,然后跳出
command1
;; # 两个分号表示退出这个分支
pattern 2)
# 只有 pattern1 不匹配时,才会检查 pattern2
# 如果匹配,执行这里,然后跳出
command2
;;
pattern 3)
# 只有 pattern1、pattern2 都不匹配时,才会检查 pattern3
command3
;;
*)
# 所有模式都不匹配时,执行默认分支
command4
;;
esac
# 案例1
case $1 in
1)
echo "安某人被捕了"
2)
echo "胡某人被捕了"
3)
echo "苗某人被捕了"
*)
echo "陈某人跑了"
esac
# 案例2(加入循环)循环输出直到选择退出【加上最后一行的done】
while true;do
cat << EOF
1.系统内存
2.显示ip
3.显示磁盘
4.退出
EOF
read -p "请输入选项:" CH
case $CH in
1) free -h ;;
2) ip a ;;
3) df -h ;;
4) break ;;
*) echo "选择错误";;
esac
donefor 循环
# 基本语法
{开始..结束} # 步长默认为1
{开始..结束..步长} # 指定步长
{开始..结束..-步长} # 递减
# 数值示例
for i in {1..10}; do # 1 2 3 4 5 6 7 8 9 10
for i in {1..10..2}; do # 1 3 5 7 9
for i in {10..1..-1}; do # 10 9 8 7 6 5 4 3 2 1
for i in {10..1..-2}; do # 10 8 6 4 2
# 字母示例
for i in {a..z}; do # a b c ... z
for i in {a..z..3}; do # a d g j m p s v y
for i in {z..a..-1}; do # z y x ... a
# for语法
# 遍历列表
for i in 1 2 3 4 5
do
echo $i
done
# 遍历数组
arr=(a b c d e)
for i in "${arr[@]}"
do
echo $i
done
# 遍历文件
for file in *.txt
do
echo "$file"
donewhile 循环
介绍:条件为真会进行下一次循环,条件为假,自动退出循环;
# \n 换行
# \t 制表 table
# \r 回车(光标移动到一行的开头)
# true 真
# false 假
# break 直接结束整个循环
# continue 跳过本次,继续下一次
# 案例1
while true
do
echo -e "$(date + '%H:%M:%S')\r"
sleep 1
done
# 案例2(ping通循环)
while ping -c1 www.baidu.com &> /dev/null
do
echo "有网"
sleep 5
done
# 案例3(ping不通一直循环)
until ping -c1 www.baidu.com &> /dev/null
do echo "等待网络"
sleep 1
done
原创
shell多分支与case语句和循环
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法