平时用if
判断命令,后面跟的是一个等式,判断这个等式是true
or false
。而linux则不同,if
后面跟着的是一个命令语句,而且当只有这个命令语句的结果码是0
的情况下才表示这个判断是正确的,并且执行if
下的命令。格式:
if command
then
command
fi
或
if command; then
commands
fi
fi
是用来表示这个语句结束。
比如
#!/bin/bash
if pwd
then
echo "It worked"
fi
/home
It worked
他会把if
后面的command
的输出也展示出来。
我们想要嵌套也没有问题。格式
if command
then
command
elif command
then
command
else
command
fi
你可能想问,if-then
语句是否能测试 命令退出状态码之外的条件。 答案是 **不能!**不过bash shell
有好工具可以帮你。
test
命令提供了在if-then
语句中测试不同条件的途径。如果test
命令中列出的条件成立, test
命令就会退出并返回退出状态码0
。这样if-then
语句就与其他编程语言中的if-then
语句 以类似的方式工作了。
test
的格式也很简单
test condition
condition是test命令要测试的一系列参数和值。
#!/bin/bash
var1="foo"
if test $var1
then
echo "It worked"
fi
It worked
test命令可以判断三类条件:
- 数值比较
- 字符串比较
- 文件比较
比较 | 描述 |
---|---|
n1 -eq n2 | 检查n1是否与n2相等 |
n1 -ge n2 | 检查n1是否大于或等于n2 |
n1 -gt n2 | 检查n1是否大于n2 |
n1 -le n2 | 检查n1是否小于或等于n2 |
n1 -lt n2 | 检查n1是否小于n2 |
n1 -ne n2 | 检查n1是否不等于n2 |
- eq (equal的缩写),表示等于为真
- ne (not equal的缩写),表示不等于为真
- gt (greater than的缩写),表示大于为真
- ge (greater&equal的缩写),表示大于等于为真
- lt (lower than的缩写),表示小于为真
- le (lower&equal的缩写),表示小于等于为真
觉得test写起来太麻烦了怎么办,没有关系,我们可以用中括号将其括起来代表一个test命令。但是中括号两端都要有一个空格,不然会报错。
if [ condition ]
then
commands
fi
比较 | 描述 |
---|---|
str1 = str2 | 检查str1是否和str2相同 |
str1 != str2 | 检查str1是否和str2不同 |
str1 < str2 | 检查str1是否比str2小 |
str1 > str2 | 检查str1是否比str2大 |
-n str1 | 检查str1的长度是否非0 |
-z str1 | 检查str1的长度是否为0 |
字符串比较相当于不相等可以直接用符号进行,但是linux
有一个重定向输出和输出,他们的符号分别是>
和<
,所以在比较的时候要记得转义,不转义很容易造成报错。
还有一点就是,字符串的比较大小写的时候,是根据ASCII
码数值来决定排序的,也就是说同一个字母,大写字母是小于小写字母的。
而我们使用sort
这个命令的时候,却是相反的输出,先输出小写字母再输出大写字母。这是因为他不是根据ASCII
码的数值比较,而是使用的是系统的本地化语言设置中定义的排序顺序。对于英语,本地化设置指定了在排序顺 序中小写字母出现在大写字母前。
比较 | 描述 |
---|---|
-d file | 检查file是否存在并是一个目录 |
-e file | 检查file是否存在 |
-f file | 检查file是否存在并是一个文件 |
-r file | 检查file是否存在并可读 |
-s file | 检查file是否存在并非空 |
-w file | 检查file是否存在并可写 |
-x file | 检查file是否存在并可执行 |
-O file | 检查file是否存在并属当前用户所有 |
-G file | 检查file是否存在并且默认组与当前用户相同 file1 |
-nt file2 | 检查file1是否比file2新 file1 |
-ot file2 | 检查file1是否比file2旧 |
if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:
- [ condition1 ] && [ condition2 ]
- [ condition1 ] || [ condition2 ]
bash shell提供了两项可在if-then语句中使用的高级特性:
- 用于数学表达式的双括号
- 用于高级字符串处理功能的双方括号
符号 | 描述 |
---|---|
val++ | 后增 |
val-- | 后减 |
++val | 先增 |
--val | 先减 |
! | 逻辑求反 |
~ | 位求反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 位布尔和 |
| | 位布尔或 |
&& | 逻辑和 |
|| | 逻辑或 |
注意,不需要将双括号中表达式里的大于号转义。这是双括号命令提供的另一个高级特性。
#!/bin/bash
# using double parenthesis
#
val1=10
#
if (( $val1 ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2"
fi
$
$ ./test23.sh
The square of 10 is 100
双方括号命令提供了针对字符串比较的高级特性。双方括号命令的格式如下:
[[ expression ]]
暂时略过
编写脚本用case功能跟switch case一样,写法略有不同。 格式
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac
可以通过竖线操作符在一行中分隔出多个模式模式。
case $USER in
rich | barbara)
echo "Welcome, $USER"
echo "Please enjoy your visit";;
testing)
echo "Special testing account";;
jessica)
echo "Do not forget to log off when you're done";;
*)
echo "Sorry, you are not allowed here";;
esac
welcome, root
please enjoy your visit