Shell 流程控制


一、if else

在 sh/bash 里,else 分支没有语句执行,就不要写这个 else


1.fi

if 格式:

if condition
then
	command1
	command2
	...
fi

写成一行:

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

末尾 fi 就是 if 倒过来。


2.if else

if else 格式:

if condition
then
	command1
	command2
	...
else
	command
fi

3.if else-if else

if else-if else 格式:

if condition1
then
	command1
elif condition2
then
	command2
else
	commandN
fi

实例:判断两个变量是否相等

a=10 b=20
if [ $a == $b ]
then
	echo "a 等于 b"
elif [ $a -gt $b ]
then
	echo "a 大于 b"
elif [ $a -lt b ]
then
	echo "a 小于 b"
else 
	echo "没有符合的条件"
fi

输出结果:

a 小于 b

if else 经常与 test 命令结合使用。

实例:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
	echo "两个数字相等"
else
	echo "两个数字不等"
fi

输出结果:

两个数字相等


二、for循环

for 格式:

for var in item1 item2 ... itemN
do
	command1
	command2
	...
done

写成一行:

for var in item1 item2 ... itemN; do command1; command2... done;

实例:

for loop in 1 2 3 4 5
do 
	echo "值是:$loop"
done

执行结果:

值是: 1
值是: 2
值是: 3
值是: 4
值是: 5


三、while语句

while 用于不断执行一系列命令。

也用于从输入文件中读取数据。

while condition
do 
	command
done

实例:

int=1
while(( $int <= 5 ))
do
	echo $int
	let int++
done

运行输出:

1
2
3
4
5

Bash let 命令,用于执行一个或多个表达式,变量计算中不需要加 $ 来表示变量。


echo "按 Ctrl+D 结束输入。"
echo -n "输入你最喜欢的人:"
while read Name
do 
	echo "$Name"
done

运行输出:

输入你喜欢人的名字:wangke
wangke

1.无限循环

while
do
	command
done

while true
do
	command
done

for (( ; ; ))


四、until循环

until不断执行一些列命令直至条件为 true 结束。

untilwhile刚好相反。

一般 while循环优于until循环。

until condition
do
	command
done

condition 的值为 false,继续执行循环语句,否则跳出循环。

实例:

a=0
until [ ! $a -lt 10 ]
do
	echo $a
	a=` expr $a + 1 `
done

运行结果:

0
1
2
3
4
5
6
7
8
9

1.case...esac

case...esac 为多选择语句。与其他语言中的 switch...case 类似。

每个 case 分支用右括号开始,用两个;;表示break,即执行结束

case 值 in
模式1)
	command1
	command2
	...
	commandN
	;;
模式2)
	command1
	command2
	...
	commandN
	;;
esac

case 值后面必须是 in每种模式以右括号结束。值与模式匹配后,里面的命令开始执行直至;;

没有匹配,使用*捕获该值,再执行后面的命令。

实例:

echo "输入 1 到 3 之间的数字"
echo "你输入的是:"
read Num
case $Num in
	1) echo "你输入的是1"
	;;
	2) echo "你输入的是2"
	;;
	3) echo "你输入的是3"
	;;
	*) echo "你没有输入 1 到 3 的数字"
	;;
esac

运行结果:

输入 1 到 3 之间的数字
你输入的是:
1
你输入的是1


五、跳出循环

1.break

break跳出所有循环(终止后面的所有循环)

while :
do
	echo -n "输入 1 到 3 的数字:"
        read Num
 
	case $Num in
    
        1|2|3) echo "你输入的数字是:$Num。"
	;;
 
	*) echo "你输入的不是 1 到 3 的数字。"
	break
	;;
	esac
done

运行结果:

输入 1 到 3 的数字:2
你输入的数字是:2。
输入 1 到 3 的数字:3
你输入的数字是:3。
输入 1 到 3 的数字:5
你输入的不是 1 到 3 的数字。

2.continue

continue不会跳出所有循环,仅跳出当前循环。

while :
do
	echo -n "输入 1 到 3 的数字:"
	read Num
	case $Num in
		1|2|3) echo "你输入的数字是:$Num。"
		;;
		*) echo "你输入的不是 1 到 3的数字。"
			continue
			echo "游戏结束。"
		;;
	esac
done

运行结果:

输入 1 到 3 的数字:2
你输入的数字是:2。
输入 1 到 3 的数字:5
你输入的不是 1 到 3 的数字。
输入 1 到 3 的数字:6
你输入的不是 1 到 3 的数字。
输入 1 到 3 的数字:3
你输入的数字是:3。

当输入大于3的数字,循环不会结束。echo "游戏结束"永远不会执行。

原文地址:https://www.cnblogs.com/keye/p/15232698.html