一、Shell流程控制
1、if 语句
条件判断语句基本语法格式为:
[ condition ]
或者
(( condition ))
1.1 if语句
基本语法格式为:
if condition
then
command1
command2
...
commandN
fi
注意:
- 最后必须以fi来闭合,fi 就是 if 倒过来拼写。也正是有了 fi 来结尾,所以即使有多条语句也不需要用{ }包围起来。
- 可以将 then 和 if 写在一行,或者整个语句写成一行。
示例如下:
#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
echo "a和b相等"
fi
1.2 if else语句
基本语法格式为:
if condition
then
command1
command2
...
commandN
else
command
fi
示例如下:
#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
echo "a和b相等"
else
echo "没有符合的条件" #输出
fi
1.3 if else-if else语句
基本语法格式为:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
示例如下:
#!/bin/bash
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
echo "ends"
2、case in语句
当分支较多,并且判断条件比较简单时,使用 case in语句就比较方便了。
基本语法格式为:
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*)
statementn
esac
case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式。
- expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以。
- pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。
case 会将 expression 的值与 pattern1、pattern2、pattern3 逐个进行匹配:
- 如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
- 如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(表示其它所有值),直到遇见双分号;;或者esac才结束。)相当于多个 if 分支语句中最后的 else 部分。
说明:
- 这里的;;和*)就相当于其它编程语言中的 break 和 default作用类似,
- Shell也可以没有*)部分。如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。
示例如下:
#!/bin/bash
echo '请输入输入数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
echo "ends"
3、for循环
for 循环是 Shell 脚本中常用的一种循环,它更加灵活易用,更加简洁明了。Shell for 循环有两种使用形式。
3.1 C语言风格的 for循环
基本语法格式为:
for((exp1; exp2; exp3))
do
command1
command2
...
commandN
done
- do 和 done 是 Shell 中的关键字。
跳出循环命令:
- break 命令允许跳出所有循环(终止执行后面的所有循环)。
- continue 命令不会跳出所有循环,仅仅跳出当前循环。
示例如下:
#!/bin/bash
sum=0
for ((i=1; i<=10; i++))
do
if(( i == 5 ))
then
continue
elif(( i > 10 ))
then
break
else
((sum += i))
echo "i = $i,sum = : $sum"
fi
done
echo "The sum is: $sum"
3.2 Python风格的 for in循环
基本语法格式为:
for variable in value_list
do
command1
command2
...
commandN
done
- variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。
- 取值列表 value_list 的形式有多种,你可以直接给出具体的值,也可以给出一个范围,还可以使用命令产生的结果,甚至使用通配符。
示例如下:
#!/bin/bash
sum=0
for n in {1..100}
do
((sum+=n))
done
echo "The sum is: $sum"
4、while循环
while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。
基本语法格式为:
while condition
do
command
done
示例如下:
#!/bin/bash
i=1
sum=0
while ((i <= 100))
do
((sum += i))
((i++))
done
echo "The sum is: $sum"
二、传递参数
运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用 $n的形式来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。同样,在调用函数时也可以传递参数。
Shell 函数参数的传递和其它编程语言不同,没有所谓的形参和实参,在定义函数时也不用指明参数的名字和数目。
这种通过 $n的形式来接收的参数,在 Shell 中称为位置参数(命令行参数)。注意:$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
1、给脚本文件传递位置参数
示例如下:脚本名为 test.sh
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
运行 test.sh,并附带参数:
注意:附带多个参数时,参数之间以空格分隔。
2、给函数传递位置参数
示例如下:脚本名为 test1.sh
#!/bin/bash
#定义函数
function func(){
echo "Language: $1"
echo "URL: $2"
}
#调用函数
func 百度 http://www.baidu.com
运行 test1.sh:
[root@centos7 tmp]# . ./test1.sh
Language: 百度
URL: http://www.baidu.com
– 求知若饥,虚心若愚。