Skip to content

Latest commit

 

History

History
201 lines (169 loc) · 5.51 KB

File metadata and controls

201 lines (169 loc) · 5.51 KB

结构化命令

平时用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
  1. eq (equal的缩写),表示等于为真
  2. ne (not equal的缩写),表示不等于为真
  3. gt (greater than的缩写),表示大于为真
  4. ge (greater&equal的缩写),表示大于等于为真
  5. lt (lower than的缩写),表示小于为真
  6. 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