一、判断test、[]、[[]]和(())
shell中的判断几乎都由此完成,test与[]完全等价。[[]]功能等于[]和expr的相加:逻辑运算&& ||,可以使用()括号和正则表达式。
①数字比较数
int1 -eq int2。 -eq、-ne、-gt、-ge、-lt、-le。意即greater than, lesser than or equal,数字不能用< > ==比较 会被当成字符串做字典序比较!
②字符串判断
[ string ]是否非空,[ str1 == str2],!=、>、<。 这里str2可以使用通配符
③逻辑运算符
&&、||、!、(),括号用于改变优先级
④文件检测
[ -e file ] 文件是否存在
[ -f file ] 是否为普通文件
[ -d file ] 是否为目录
[ -r file ] 是否存在且当前用户可读
正则表达式匹配 str1 =~ str2, str2是pattern
注意事项:
[[ shine != 20024 ]], 这里一共出现4个空格,[[语句本身2个 !=操作符左右也必须有(这跟expr一样)
echo $?, $?是上一句执行后的回传码,回传0表示标准输出|正确执行,否则是标准错误|错误执行。
2、更好用的(()),[[]]主要用于数字和字符串的比较,(())不用于字符串的比较
①可以运算,且是变量的多个表达式的运算eg:((a=2,b=2+ 1, var=6));
②c的数字逻辑运算 var=$((a*=++b *a)) ,没有那四个空格的限制
③同样可以用于判断(包括bc判断)
④和$[]一样可以直接使用变量,不用加$
二、流程控制
①if的判断: 看返回码是否为0,为0则正确执行
if [[ shine != 20034 && !($var -ne 12) ]];
then
echo that is good;
else if [[ $var > 20 ]] || [[ shine =~ [a-z]{3,} ]];
then
echo it is great;
else
echo default;
fi
②case语句
以下例case.sh和select.sh
注意说明
(apple)和 apple)都能行,左括号不必要。
对$1变量进行通配符匹配,不是正则表达式匹配哦
三种退出当前分支: ;&表无需匹配地执行下一分句,;;&需匹配地执行所有分句,;;执行完当前分局后表跳出case
③条件结构select
如上右图,因为没有break命令跳出select 将一直选择执行下去。select常与case搭配使用
#!/bin/bash
select ch in "Linux" "Windows" "Mac OS"
do
case $ch in
"Linux1")
echo "Linux是一个类UNIX操作系统,开源免费"
break
;; # ;;是不可省略的
"Windows")
echo "Windows是微软开发的个人电脑操作系统,闭源收费"
break
;;
"Mac OS")
echo "Mac OS是苹果公司开发的一款图形界面操作系统"
break
;;
*)
echo "没有这个选项!"
break
esac
done
echo i have select $ch
④for循环两种使用
一是for in ,二是((C语言方式))
#!/bin/bash
for ((i=1,j=100; i<=3 && j>=3; ++i,--j));
do
printf "%-5d%-5d\n" $i $j
done
let i=1,sum=0
while [ $i -le 10 ];
do
let sum+=i;
let ++i;
done
echo $sum
2021-12-09 17:04:23