目录
一、Shell流程控制
1、条件语句
(1)单分支if
(2)多分支if
2、循环语句
(1)for循环
(2)while循环
(3)until 循环
(4)break 与 continue
(5)case 语句
二、Shell函数
(1)函数的标准语法
函数的简化语法—>不推荐使用
(2)函数的调用
(3)参数
(4)函数返回值
只有一个 if 语句块包含的语句,condition 为正确则执行 then 内的命令,语法格式:
if condition
then
command1
command2
...
commandN
fi
顾名思义有多个 if 条件,在此利用 elif 来表示,注意最后有一个 else 结尾。
if condition1;then
command1
elif condition2;then
command2
...
...
elif conditionN,then
commandN
else
command
fi
示例:判断sshd程序是否存在
if [ $(ps -ef |grep /usr/sbin/sshd|grep -v grep|wc -l) -eq 1 ];then
echo "sshd server exist"
else
service sshd start && echo "启动sshd服务"
fi
默认 for 循环的取值列表是以 $IFS
分割,默认 $IFS
为空白符,如果我们有其他需求可以更改,语法为:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
通过 for 循环每次遍历一个后面跟的对象,在 do…done
操作块中对对象进行一些列操作。
例如我们来求和 1-10 的和:
SUM=0
for num in $(seq 1 10)
do
let SUM=${SUM}+${num}
done
echo "1-10的和为:${SUM}"
修改 $IFS
的应用场景,首选备份默认当前的 $IFS
,之后为其赋值新的 $IFS
为:
,执行一系列操作后,恢复之前的 $IFS
#!/bin/bash
OLD_IFS=$IFS
IFS=":"
...
IFS=${OLD_IFS}
while 循环通常用于处理未知数量对象的操作,语法:
while 条件表达式:do
command
done
while 通常与 test 语句配合使用,如果条件表达式成立,则一直执行。例如求和打印 1-5 个数:
注:let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。
#!/bin/bash
N=0
while [ $N -lt 5 ]; do
let N++
echo $N
done
until 循环,条件表达式为 true 时停止,否则一直运行,语法:
until 条件表达式
do
command
done
例如我们使用 until 来打印 1-5 数字:
NUM=0
until [ ${NUM} -ge 5 ]
do
let NUM++
echo $NUM
done
break 为跳出循环,continue 则为不执行下一次操作,直接跳到下一次循环。示例:
#!/bin/bash
N=0
while true; do
let N++
if [ $N -eq 5 ]; then
break
fi
echo $N
done
选择语句 case 可以在特定的几个条件中选择某一个进行执行,其他 case 可以利用 if 多分支来替代。
case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
*)
不符合以上模式执行的命令
esac
应用示例:
#!/bin/bash
case $1 in
start)
echo "start."
;;
stop)
echo "stop."
;;
restart)
echo "restart."
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
Shell 和其他语言一样,也有函数,其本质就是一段可以复用的代码。将数据进行抽离处理,传递不同的值输出不同的结果,在指定的地方进行调用即可。
function fnname() {
statements
return value
}
对各个部分的说明:
function
是 Shell 中的关键字,专门用来定义函数;fname
是函数名;statements
是函数要执行的代码,也就是一组语句;return value
表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值,这一部分可以写也可以不写。函数名后无括号
#简化写法1
function fname{
statements
return n
}
函数不写 function
#简化写法2:
fname() {
statements
return n
}
注意:在函数定义中需要函数名称后可以有多个空格,括号内也可以有多个空格,如果函数体写在一行,需要在语句末尾加上 ;
。
Shell 脚本中,函数在定义时候不能指定参数,在调用的时候传递参数即可,并且在调用函数时传递什么参数函数就接受什么参数。
// 定义函数
function fnname() {
statements
return value
}
// 调用函数
fname param1 param2 param3
在 Shell 中特殊含义的参数
注意:局部变量需要特别声明在函数内部利用 local
关键字来声明。
函数中返回利用 return
关键字,在函数调用完成后,我们利用 $?
来接受函数的返回值。
注意:shell 函数的返回值,只能是整形,并且在 0-257 之间,不能是字符串或其他形式。并且在调用方法和取得返回值之间,不能有任何操作,不然取不到 return 的值。
[root@master func]# cat f1.sh
#!/bin/bash
function fsum() {
echo "函数第一个参数为: ${1}"
echo "函数第二个参数为: ${2}"
echo "函数第三个参数为: ${3}"
echo "函数的参数总数为: ${#}"
echo "函数的参数总数为: ${@}"
local sum=0
for num in ${@};
do
let sum=${sum}+${num}
done
return $sum
}
fsum 10 20 1 2
echo $?
[root@master func]# bash f1.sh
函数第一个参数为: 10
函数第二个参数为: 20
函数第三个参数为: 1
函数的参数总数为: 4
函数的参数总数为: 10 20 1 2
33