在linux shell中,通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更为复杂的逻辑判断,我们就需要使用流程控制语句来支持了。
所谓流程控制既是通过使用流程控制语句对程序流程的选择、循环、转向和返回等进行控制。流程控制是所有编程语言分重要组成部分,linux shell同样有一套自己的流程控制语句,其中主要包括条件语句(if),循环语(for,while),选择语句(case)。
条件选择if语句
单分支
if判断条件;then
条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件1; then
条件为真的分支代码
elif 判断条件2; then
条件为真的分支代码
elif 判断条件3; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
逐个条件进行判断,第一次为“真”条件时,接着执行其分支,而后结束整个if语句
条件判断case语句
case 变量引用 in #变量的引用加$
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b
练习
1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果
指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息
#!/bin/bash
read -p "please input username:" username
useradd $username &> /dev/null
if [ $? -eq 0 ];then
echo "add $username user" && id $username
else
echo "the user already exits"
fi
2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的
是yes还是no,或是其它信息
#!/bin/bash
read -p "Do you agree? yes or no: " ANS
if [ -z "$ANS" ] ;then
echo "Please input yes or no"
exit
fi
case $ANS in
[Yy]|[Yy][Ee][Ss])
echo "Your answer is YES"
;;
[Nn]|[Nn][Oo])
echo "Your answer is NO"
;;
*)
echo "Your answer is fales"
esac
3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型
(普通,目录,链接,其它文件类型)
#!/bin/bash
read -p "input file or dir:" choose
[ -z "$choose" ] && echo "Please input a file or dir"
if [ -d "$choose" ] ;then
echo "$choose is directory"
elif [ -L "$choose" ] ;then
echo "$choose is a link"
elif [ -f "$choose" ] ;then
echo "$choose is a common file"
else
echo "$choose is other type"
fi
4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数
#!/bin/bash
read -p "input a digit:" NUM
if [[ "$NUM" =~ ^[0-9]+$ ]] ;then
echo "$NUM is a int"
fi
循环
循环执行
将某代码段重复运行多次
重复运行多少次
循环次数事先已知
循环次数事先未知
有进入条件和退出条件
for, while, until
for循环
for 变量名 in 列表;
do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直 到列表中的元素耗尽,循环结束
列表生成方式:
(1) 直接给出列表
for num in 1 2 3 4 5;do echo The number is $num ;done
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
(2) 整数列表:
(a) {start..end}
for num in {10..1..3};do echo The numberis $num ;done
The numberis 10
The numberis 7
The numberis 4
The numberis 1
(b) $(seq [start [step]] end)
for num in `seq 2 4 10`;do echo The number is $num ;done
The number is 2
The number is 6
The number is 10
(3) 返回列表的命令 $(COMMAND)
(4) 使用glob,如:*.sh
for num in "/root/bin/*.sh";do echo The filename is $num ;done
The filename is /root/bin/*.sh
(5) 变量引用; $@独立, $*整体(位置变量)
多行重定向
练习:
用for实现
1、打印国际象棋
for i in {1..8};do
for j in {1..4};do
if [ $[i%2] -eq 0 ];then
echo -e "