shell学习笔记(四)shell控制流结构目录:
=======================================================
条件语句
if语法结构
循环语句
for语法结构
1.for … in 语句
2.for((赋值;条件;运算语句))
while语法结构
until语法结构
break和continue控制
选择语句
case语法结构
========================================================
条件语句
if语法结构
if 条件1
如果条件1为真
then
那么
action command1
执行命令1
elif 条件
如果条件1不成立
then
那么
action command 2
执行命令2
else
如果条件1与条件2都不成立
action command 3
执行命令3
fi
完成
--------------------------------------------------------------
eg:
[root@viong_app1 soft]#
cat if.sh
#!/bin/sh
scores=85;
if [ $scores -gt 90 ]; then
#[ ]中的值必须是[空格expression空格]
echo "very good!";
elif [ $scores -gt 80 ]; then
echo "good!";
elif [ $scores -gt 60 ]; then
echo "pass!";
else
echo "no pass!";
fi;
[root@viong_app1 soft]#
chmod 755 if.sh
[root@viong_app1 soft]#
./if.sh
good!
--------------------------------------------------------------
[root@viong_app1 soft]#
cat if1.sh
#!/bin/bash
echo -n "Enter you name:"
read NAME
if [ -z $NAME ] || [ "$NAME" = "" ];then
echo "You don't enter a name"
elif [ "$NAME" = root ];then
echo "hello root"
else
echo "hello $NAME"
fi
[root@viong_app1 soft]# ./if1.sh
输入为root则打印echo hello root
Enter you name:root
hello root
[root@viong_app1 soft]# ./if1.sh 输入为任意字符未匹配1 2 条件则echo hello $NAME
Enter you name:viong
hello viong
[root@viong_app1 soft]# ./if1.sh
输入为空字符或者空格则打印echo You don't enter a name
Enter you name:
You don't enter a name
简单结构:
if 条件1
如果条件1为真
then
那么
action command 1 执行命令1
fi
完成
eg:
[root@viong_app1 soft]#
if [ 10 -lt 21 ];then echo "YES";fi;
YES
条件测试有:[[]],[],test 这几种,注意:if与[ ]用空格分开,[ ]与变量之间用空格分开
[ ]内是整数时不能使用条件运算符
shell命令,可以按照分号分割,也可以按照换行符分割。如果想一行写入多个命令,可以通过“';”分割
循环语句
for语法结构
1.for … in 语句
for 变量 in 列表
do
action command1
action command2
done
当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值
只要用
空格字符分割,每次for…in 读取时候,就会
按顺序将读到值,给前面的变量
命令可为任何有效的shell命令和语句
变量名为任何单词
in列表用法是可选,如果不用它,for循环使用命令行的位置参数
in列表可以包含替换,字符串和文件名
[root@viong_app1 soft]#
cat for.sh
#!/bin/bash
#for
for abc in {1..5}
do
echo $abc
done
[root@viong_app1 soft]#
./for.sh
1
2
3
4
5
这脚本实现相当于seq命令
[root@viong_app1 soft]# seq 5
1
2
3
4
5
------------------------------------------------------
[root@viong_app1 soft]#
cat for.sh
#!/bin/bash
#for
for abc in “lin hong viong” 注意:如果把双引号去掉就变成三个字符换行打印出来
do
echo $abc
done
[root@viong_app1 soft]# ./for.sh
lin hong viong
2.for((赋值;条件;运算语句))
for((赋值;条件;运算语句))
do
action command
done;
eg:
[root@viong_app1 soft]#
cat for2.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo $i
done
[root@viong_app1 soft]#
./for2.sh
1
2
3
4
5
6
7
8
9
10
while语法结构
while action command1
do
action command2
action command3
done
注:在while
和do
之间虽然通常只使用一个命令,但可以放几个命令,命令通常用作测试条件
eg:
[root@viong_app1 soft]#
cat ./while.sh
#!/bin/bash
i=5
while [ $i -ge 1 ]
do
echo $i
((i--))
#必须是双括号或者[ i-- ]
done
[root@viong_app1 soft]#
./while.sh
5
4
3
2
1
------------------------------------------------------
[root@viong_app1 soft]#
cat while2.sh
#!/bin/bash
echo "按住+D退出输入."
while echo -n "输入你最喜欢的电影:";read FILM
do
echo "Yeah,$FILM是一部好电影!"
done
[root@viong_app1 soft]#
./while2.sh
按住+D退出输入.
输入你最喜欢的电影:铁甲钢拳
Yeah,铁甲钢拳是一部好电影!
输入你最喜欢的电影:[root@viong_app1 soft]#
[root@viong_app1 soft]# cat name
1
2
3
4
5
6
[root@viong_app1 soft]# cat while1.sh
#!/bin/bash
while read LINE
do
echo $LINE
done
[root@viong_app1 soft]# ./while1.sh
1
2
3
4
5
6
如果把name放在 while read LINE
until语法结构
until 条件
do
action command 1
action command 2
done
注意:条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次
until提供循环执行,它与while循环相反,
until
循环将反复执行直到条件为真就结束循环,而while循环条件为假就结束循环。until并没有等价的while那么好用,而且许多shell版本不支持,BASH支持,所以很多程序员不喜欢用
eg:
[root@viong_app1 soft]# cat until.sh
#!/bin/bash
X=1
until (( X > 10 ))
do
echo hello X is $X
let X=X+1
done
[root@viong_app1 soft]# ./until.sh
hello X is 1
hello X is 2
hello X is 3
hello X is 4
hello X is 5
hello X is 6
hello X is 7
hello X is 8
hello X is 9
hello X is 10
break和continue控制
break [n]
退出循环
如果是在一个嵌入循环里,可以指定n来跳出的循环个数
eg:
[root@viong_app1 soft]#
cat break.sh
#!/bin/bash
#break
while : #冒号代表一直为真,一直循环下去
do
echo -n "Enter any Nun[1..5]:"
read NUN
case $NUN in
1|2|3|4|5)
echo "You enter a number between 1 and 5"
;;
*)
echo "Wrong number.bye"
break
;;
esac
done
[root@viong_app1 soft]#
./break.sh
Enter any Nun[1..5]:1
You enter a number between 1 and 5
Enter any Nun[1..5]:2
You enter a number between 1 and 5
Enter any Nun[1..5]:a
Wrong number.bye
-----------------------------------------
continue
跳出循环步
注:continue命令类似于break命令,只有一点重要差别,它不会跳出循环,只是跳出这个循环步
eg:
[root@viong_app1 soft]#
cat continue.sh
#!/bin/bash
#continue
while : #冒号代表一直为真,一直循环下去
do
echo -n "Enter any Nun[1..5]:"
read NUN
case $NUN in
1|2|3|4|5)
echo "You enter a number between 1 and 5"
;;
*)
echo "Wrong number,continue(y/n)?:"
read CONTINUE
case $CONTINUE in
y|yes|Y|yes)
continue
;;
*)
break
;;
esac
esac
done
[root@viong_app1 soft]#
./continue.sh
Enter any Nun[1..5]:3
You enter a number between 1 and 5
Enter any Nun[1..5]:a
Wrong number,continue(y/n)?:
y
Enter any Nun[1..5]:b
Wrong number,continue(y/n)?:
n
选择语句
case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
case语法结构
case 值 in
模式1)
action command 1
;;
模式2)
action command 2
;;
esac
case取值后面必须为单词in,每一模式必须以右括号”)”结束,取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至两个分号 ;; .模式匹配符*表示任意字符,?表示任意单字符,[.. ]表示类或范围中任意字符
eg:
[root@viong_app1 soft]# cat case.sh
#!/bin/bash
FRUIT=
$1
if [ -z "$1" ]
then
echo "没有在第一个参数输入水果"
else
case "$FRUIT" in
apple|APPLE) echo "THE FRUIT is apple";;
banana|BANANA) echo "THE FRULT is banana";;
*) echo "输入的是不是我要的水果啊?";;
esac
fi
[root@viong_app1 soft]# ./case.sh
没有在第一个参数输入水果
[root@viong_app1 soft]# ./case.sh apple
THE FRUIT is apple
[root@viong_app1 soft]# ./case.sh app
输入的是不是我要的水果啊?
$1是外部传参的值,通过这个例子就能想到平时类似server httpd restart命令,就是利用case调用