Linux shell脚本流程控制
博主搬家至51CTO,初来乍到,请多指教。此次我们来通过实例解析Linux shell脚本流程控制
Linux shell脚本流程控制可分为三类:顺序执行,条件选择执行,循环执行
顺序执行:简单理解就是逐行执行脚本内容,逐行解读,逐行执行。(此处不做实例解析)
条件选择执行:可以理解为先进行某一条件的判断选择,再决定执行怎样的脚本内容。常见语句if case
条件选择语句:if
if语句用法:
单分支
if 判断条件;then
条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件 1 ; then
条件为真的分支代码
elif 判断条件 2 ; then
条件为真的分支代码
elif 判断条件 3 ; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
注意:if语句支持嵌套,逐个条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if判断,否则的话向后进行判断。
经典实例解析:
根据输入的分数来判断ABCD等
#提示用户输入分数
read -p "please input your score : " score
#判断用户输入是否有误
[[ $score =~ ^{1,2}$ ]] || { echo "your input wrong" ; exit; }
#if判断
if [ $score -gt 90 ]; then #首先判断分数是否大于90
echo "A" #大于90的话执行
elif [ $score -gt 70 ]; then #不大于90,接着判断是否大于70
echo "B" #大于70小于90的话执行
elif [ $score -gt 60 ]; then #不大于70,接着判断是否大于60
echo "C" #大于60小于70的话执行
else #判断条件都不满足:小于60的话执行
echo "D"
fi
#变量删除
unset score
条件判断语句:case
case语句用法:
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
注意:case的变量引用,用$引用某变量。
case 支持glob 风格的通配符:
*: 任意长度任意字符 ?: 任意单个字符
[] :指定范围内的任意单个字符 a|b: a或b
经典实例解析:
根据输入的分数来判断ABCD等
read -p "please input your score : " score
[[ $score =~ ^{1,2}$ ]] || { echo "your input wrong" ; exit; }
#case选择
case $score in #case开头,引用变量 in
9?) #支持通配符:判断变量值为9X的话,执行该分支内容
echo "A"
;;
7?|8?) #判断变量值为7X或8X的话,执行该分支内容,也可写为?)
echo "B"
;;
6?) #判断变量值为6X的话,执行该分支内容
echo "C"
;;
*) #如果变量值不符合上述所有的判断,执行该分支内容
echo "D"
;;
esac #以case的反序esac结束
unset score
循环执行:根据条件循环执行X次某一部分脚本内容(循环体)。常见循环语句for while until
循环语句:for(有两种用法)
for语句用法:
[*] for 变量名 in 列表;do
循环体
done
注意:依次将列表中的元素赋值给“变量名”,每次赋值后即执行一次循环体,直到列表中的元素耗尽,循环结束。
列表生成方式:
(1) 直接给出列表
(2) 整数列表:(a) {start..end}或者(b) $(seq] end)
(3) 返回列表的命令$(COMMAND)或者``
(4) 使用glob,如:*.sh
(5) 变量引用,如:$@,$*
[*] for (( 控制变量初始化; 条件判断表达式; 控制变量的修正表达式))
do
循环体
done
解释:常用于数字循环。实现类似于C语言风格的操作
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
经典实例解析:
计算1到输入数字的所有值(1+2+...+X)的总和
#for语句用法1
read -p "请输入一个数字: " int
if `echo $int | grep "^\+\b" &> /dev/null` ; then #判断用户输入是否为数字
sum=0
for i in $(seq $int) ; do #将seq $int的执行结果作为列表循环可以写为`seq $int`
let sum+=$i #执行循环体内容,列表未结束的话,接着循环。
done #do与done配套使用do开始,done结束循环。
echo "总和为:$sum"
else
echo "不要调皮,请输入数字"
fi
#for语句用法2
read -p "请输入一个数字: " int
if `echo $int | grep "^\+\b" &> /dev/null` ; then
for ((i=0,sum=0;i /dev/null` ; then
sum=0
while [ 0 -lt $int ] ; do #判断为真时,循环循环体,为假时退出循环。
let sum+=$int
let int--
done
echo "$sum"
else
echo "不要调皮,请输入数字"
fi
while循环的特殊用法(遍历文件的每一行):
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
解释:依次读取/PATH/FROM/SOMEFILE 文件中的每一行,且将行赋值给变量line
经典实例解析:
计算1到输入数字的所有值(1+2+...+X)的总和
>line.txt #清空文件
read -p "请输入一个数字: " int
if `echo $int | grep "^\+\b" &> /dev/null` ; then
seq $int > /shell/line.txt #将数字每个数字一行导入文件
sum=0
while read line ;do #读取每一行即数字,赋值给变量
let sum+=$line
done < /shell/line.txt
echo "$sum"
else
echo "不要调皮,请输入数字"
fi
循环语句:until
until循环用法与while循环一样,只是循环判断相反,while循环,当条件为真时执行循环体,为假时退出,而until循环,当条件为假时执行循环体,条件为真时退出。
经典实例解析:
计算1到输入数字的所有值(1+2+...+X)的总和
#将while示例中的while [ 0 -lt $int ] ; do改为until [ 0 -gt $int ] ; do注意两者的区别以及转换 循环控制语句:作用于循环体,用来控制满足某一条件的循环执行。常见控制语句:continue break shift
continue语句:continue 跳过满足条件的某一层执行操作,继续进行下一次判断,最内层循环为第1层。依次类推。
经典实例解析:
计算1到100的值的总和(编)
for ((i=0,sum=0;i
页:
[1]