循环结构
until循环
语法格式:
until 测试命令; do 命令块; done
只要测试命令返回非零值就执行命令块。其返回值是命令块中最后一个被执行的命令的返回值。如果命令
块没有被执行则返回0;
例子
使用until实现1到100的累加
#!/bin/bash
n=1
sum=0
until [ $n -gt 100 ];do
let sum+=n
let n++
done
echo $sum
while循环
语法格式:
while 测试命令; do 命令块; done
只要测试命令返回零就执行命令块。其返回值是命令块中最后一个被执行的命令的返回值。如果命令块没有
被执行则返回零。
例子
使用while实现对/etc/passwd的逐行读取,并输出总行数
#!/bin/bash
n=0
while read line;do
let n++
echo $line
done < /etc/passwd
echo $n
for循环
语法格式:
-
for 变量 [in 单词]; do 命令块; done
将单词扩展成一个列表,然后把结果中列表的每个元素都赋值给变量并执行一次命令块。如果没有[in 单
词]这部分,则for 依次对每个位置参数都执行一次命令块,就好像指定了"in $@"。其返回值是命令块中最后一个被执行的命令的返回值。如果对单词的扩展没有得到任何元素,则不执行任何命令,并返回零。 -
for (( 表达式一; 表达式二; 表达式三)); do 命令块; done
例子:
使用for输出1到10
#!/bin/bash
for i in `seq 1 10`;do
echo $i
done
条件结构
if
语法格式
if 测试命令一; then
命令块一;
[elif 测试命令二; then
命令块二;]
…
[else
其它命令块;]
fi
例子
使用while和if实现的一个猜数字的脚本
[root@localhost ~]# cat guess_number.sh
#!/bin/bash
guess_number(){
t=$1
while :;do
read -p "Input the number:" n
if [ $n -gt $t ];then
echo "retype a smaller number"
elif [ $n -lt $t ];then
echo "retype a bigger number"
else
echo "Right!!!"
exit 0
fi
done
}
if [ $# -eq 0 ];then
echo "请输入参数"
exit 1
fi
guess_number $1
[root@localhost ~]# bash guess_number.sh
请输入参数
[root@localhost ~]# bash guess_number.sh 9
Input the number:2
retype a bigger number
Input the number:10
retype a smaller number
Input the number:9
Right!!!
case
语法格式
case 值 in
模式1)
command1
command2
…
commandN
;;
模式2)
command1
command2
…
commandN
;;
…
esac
例子
[root@localhost ~]# cat case.sh
#!/bin/bash
echo -n "请输入一个动物的名称:"
read animal
echo -n "$animal有"
case $animal in
马|狗|猫)
echo -n "四"
;;
人|猴)
echo -n "两"
;;
*)
echo -n "未知"
;;
esac
echo "条腿"
[root@localhost ~]# bash case.sh
请输入一个动物的名称:人
人有两条腿