shell编程进阶

参数判断语句:
格式:[ 判断类型 判断的参数 ]

[ -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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值