一、shell判断语句
(1)、shell语言通过test、[]、[[]]命令进行条件的测试
(2)、根据条件的真、假执行不同的操作
1、if语句
if语句根据某个特定条件是否满足,来选择执行相应的语句,if语句中的条件判断
#!/bin/bash
read -p "Are you ok:(y/n)?" answer
if [[ $answer == [Yy] * || $answer == Maybe ]]
then
echo "Glab to hear it."
fi
#!/bin/bash
num1=30
num2=40
if (( $num1 > $num2 ))
then
echo "num1>num2"
else
echo "num1<num2"
fi
#!/bin/bash
read -p "Are you ok:(y/n)?" answer
if [[ $answer == y ]]
then
echo "yes"
elif [[ $answer == n ]]
then
echo "no"
else
echo $answer
fi
2、case语句
(1)、case行尾必须为单词“in”,每一个模式必须以右括号“)”结束
(2)、双分号“;;”表示命令序列结束
(3)、匹配模式中可是使用方括号表示一个连接的范围,如[0-9];使用竖杠符号“|”表示或
(4)最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后的命令序列
#!/bin/bash
read -p "Input a character:" value
case $value in
[a-z][A-Z])
echo "You input a letter."
;;
[0-9])
echo "You input a digit."
;;
*)
echo "You input a special value"
;;
esac
二、循环语句
(1)、循环语句用于将一个或一组命令执行指定的次数,或一直执行直到满足某个条件为止
(2)、Bash shell提供了3种类型的循环:for循环、while循环、until循环
1、for循环
for命令后面跟一个用户自定义的变量、关键字in和一个集合。执行第一轮循环时,现将集合中的第一个元素赋给变量,并把该元素从集合中移走,然后进入循环体,执行关键字do和done之间的命令。下一次进入循环时,则将第二个元素赋给变量
#!/bin/bash
for person in Tom Jack Peter
do
echo "Hi $person"
done
#!/bin/bash
for user in Tom $(cut -d':' -f1 /etc/passwd)
do
echo "Hi $user"
done
注:cut和awk一样,-d是按:进行分割,-f1取第一个字段
#!/bin/bash
for file in $*
do
if [[ -f $file && ! -x $file ]]
then
chmod u+x $file
echo $file now has execute permission
fi
done
注:$*表示所有的参数,执行file命令后跟的所有参数;-f判断是否文件;-x判断是否可执行;代码可优化,将“$*”改为“$(ls)”
2、while语句
(1)、while循环命令对紧跟在它后面的条件(命令)进行判断,如果该条件为真,就执行循环体内的命令(即关键字do和done之间的命令)
(2)、执行到关键字done后,控制回到循环的顶部,while命令再次检查该条件,循环将一直持续下去,直到while检测到条件为假
#!/bin/bash
declare -i num=0
while (( $num<10 ))
do
echo -n "$num"
len num+=1
done
echo -e "\nLoop exits!"
#!/bin/bash
echo "Where does Yao come from?"
read answer
while [[ "$answer" != "China" ]]
do
echo "Wrong try again!"
read answer
done
echo "You got it!"
3、until语句
使用until循环语句时,首先执行条件测试并判断其返回值,若条件不成立则执行循环,一直到该测试条件成立时为止,即退出循环
#!/bin/bash
until who | grep root
do
sleep 5
done
echo "root is loging"
注:who查看用户登录;sleep 5等待5秒
4、循环控制
(1)、break命令:用于退出循环
(2)、continue命令:用于退出本次循环,跳转至循环语句的顶部重新测试条件
#!/bin/bash
while true
do
echo "Input your password: "
read password
if [[ "$password" == "123321" ]]
then
break
else
echo "Password error!"
fi
done
echo "Welcome!"
注:while true是一个死循环
#!/bin/bash
for name in good1 good2 bad good3
do
if [[ $name == "bad" ]]
then
continue
else
echo "Hello $name"
fi
done
5、shift命令
执行shift命令后,位置变量($1~$9)中的命令行参数会依次向左传递
#!/bin/bash
sum=0
while [ $# -gt 0 ]
do
let sum=sum+$1
shift
done
echo "The sum is: $sum"
注:$#代表参数个数;-gt 0代表大于0
6、select命令
(1)、select命令用于创建菜单,按数字顺序排列菜单项并将列表显示在标准输出上面,并提示用户输入,使用变量PS3指定提示语
(2)、select命令是一个循环命令,需要使用break退出循环,或使用exit退出脚本程序
#!/bin/bash
PS3="Select a program to execute:"
select program in 'ls -F' pwd date
do
$program
# break
done
7、函数-使用规则
(1)、函数必须先定义,后使用
(2)、函数在当前环境中运行。函数共享调用它的脚本中的变量,允许以给定位置参数赋值的方式向函数传递参数
(3)、使用local功能在函数内部创建局部变量
(4)、如果在函数中使用exit命令,就会退出整个脚本。如果只是从函数中退出,就只是返回到脚本调用函数的地方
(5)、函数中的return语句,返回函数执行的最后一条命令的退出状态,或返回指定的参数值
(6)、使用命令export -f可以把函数导出到子shell中
(7)、使用declare -f命令可以列出函数名以及其定义,使用declare -F命令只列出函数名
(8)、如果函数保存在其他文件中,可以用souce或“.”命令把它们载入到当前脚本中
(8)、函数支持递归调用,且递归调用次数没有限制
#!/bin/bash
#Say hello to the first parameter
function sayhello {
echo "Hello $1"
}
sayhello $1
#!/bin/bash
#Say hello to the first parameter
sayhello() {
echo "Hello $1"
}
sayhello $1
(9)、消除某个函数,使用unset命令
- 格式:unset 函数名
(11)、可以将函数导出,使它们在子shell中可以使用
- 格式:export -f 函数名