参数判断语句:
格式:[ 判断类型 判断的参数 ]
[ -d /root ] #判断/root是不是一个目录,成立返回true,不成立返回false
判断语句写在中括号内,中括号之间的空格不能缺少,否则报错。
通过echo $?来查看上一条语句的执行结果,执行成功时返回0,执行失败时返回非0值。
shell和其他编程语言不一样的是:
shell没有真正的bool值,false和true都是字符串。
"true"等于"0"等于0
"false"等于"1"等于1
关于shell的bool类型为什么是反过来的,可以参考以下链接:
https://blog.csdn.net/appke846/article/details/80652465
可以通过以下脚本来测试:
if((true==0));then echo "true=0";fi #输出 true=0
以下列举了常用的判断类型:
操作符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
比较判断语句:
格式:[ 参数1 比较类型 参数2 ]
[ $1 -eq 10 ] #比较$1是否等于10
以下列举了常用的比较类型:
操作符 | 作用 |
---|---|
-eq | 判断是否等于 |
-ne | 判断是否不等于 |
-gt | 判断是否大于 |
-lt | 判断是否小于 |
-le | 判断是否小于或等于 |
-ge | 判断是否大于或等于 |
字符判断语句:
[ 字符串1 = 字符串2 ] #判断字符串内容是否相同
[ 字符串1 != 字符串2 ] #判断字符串内容是否不同
[ -z 字符串 ] #判断字符串内容是否为空
逻辑判断语句:
shell中||和&&没有优先级概念。逻辑判断语句按照从左到右的顺序执行。
如果要让某部分语句当作一个整体,需要用{}把要当成整体的语句括起来。
!命令 (如果命令执行成功这返回失败;如果命令执行失败则返回成功)
命令a ; 命令b (顺序执行,执行完命令a再执行命令b)
命令a && 命令b (如果命令a执行成功,继续执行命令b;如果命令a没有执行,则不执行命令b)
命令a || 命令b (如果当命令a执行失败,继续执行命令b;如果命令a成功执行,则不执行命令b)
多重逻辑判断:
命令a || 命令b && 命令c (只有A,B都执行失败时,才不会执行C;AB只要有一个成功,就会执行C)
要点:a || b 返回一个结果,再&&c。
命令a && 命令b || 命令c (只有A,B都执行成功时,才不会执行C;AB只要有一个失败,就会执行C)
要点:a && b 返回一个结果,再||c。
参数判断语句和逻辑判断语句结合可以实现强大的功能。
问题:判断用户输入的文件是否已存在,如果存在则提示文件已存在;否则提示文件不存在。
方法一:
[ -f ${filename} ] && echo "文件存在" || echo "文件不存在"
方法二:
test -e ${filename} || { echo "${filename} not exist";exit 0;}
要点:将{ echo “${filename} not exist”;exit 0;}当成一个整体,再进行逻辑判断
test命令也可以写成[ ],需要注意的是[ ]必须要加空格。
test $变量名 #测试变量是否存在。存在返回true,否则返回false
[ $PATH ] #同上。存在返回true,否则返回false
if判断语句:
格式:
if [ 判断语句 ]
then
然后执行命令块
else
否者执行命令块
fi
问题:判断/root/chen目录是否存在,不存在则创建
if [ -d /root/chen ]
then
echo "目录已存在"
else
echo "目录不存在,创建目录"
mkdir /root/chen
fi
for遍历循环语句:
格式:
for 变量名 in 取值列表
do
执行命令块
done
问题:输出数组的每个值
arr=(5 4 3 2 1 0)
for i in ${a[*]}
do
echo "$i"
done
for循环语句:
问题:创建文件名为1到10的文件
for ((i=0; i<=10; i++));do
touch $i
done
while循环语句:
格式:
while [ 判断语句 ]
do
执行命令块
done
问题:让变量i=0不断累加到10
i=0
while [ $i -le 10 ]或者while(($i<=10))
do
echo "i的值为$i"
let i++
done
until循环语句:
until循环和while相反,当条件为true时停止。
问题:让变量i=0不断累加到10
i=0
until [ $i -gt 10 ]或者until(($i>10))
do
echo "i的值为$i"
let i++
done
case字符匹配语句:
格式:
case 参数 in
通配符1)
执行命令块;;
通配符2)
执行命令块;;
*)
执行命令块;;
esac
问题:匹配用户输入的字符,输出是字符还是数字,或者是其他字符。
case $1 in
[a-z] | [A-Z])
echo "输入的字符为字母";;
[0-9])
echo "输入的字符为数字";;
*)
echo "输入的字符为其他特殊字符";;
esac
其他语句:
break #跳出所有循环
continue #跳出当前循环
函数定义:
格式:
函数名()
{
执行的命令块
return $变量名
}
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、可以不写return 语句,如果不写,将以最后一条命令运行结果,作为返回值。
函数调用:
函数名
函数参数:
函数内获取参数:
$1 #参数1
$2 #参数2
$# #参数的个数
调用函数时传递参数:
函数名 参数1 参数2
shell脚本案例:
https://www.cnblogs.com/xxbbtt/p/11339523.html
https://www.cnblogs.com/TFBOYS0806/p/13578137.html
参考资料:
https://www.jianshu.com/p/b31316ad3b64
https://www.cnblogs.com/zjiacun/p/8192413.html
https://qastack.cn/unix/88850/precedence-of-the-shell-logical-operators