《Linux Command Line and Shell Scripting Bible》Part 12 使用结构化命令

12.1使用if-then语句

 最基本的结构化命令

if command

then

 command

fi

这里的command必须exit的返回值是0

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test1.sh 
/Users/shijianzhong/learn_shell/part_12
It worked
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test1.sh 
#! /bin/bash

if pwd
then
    echo It worked
fi
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

有些脚本可能的写法为if command; then

commands

fi

 

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test3.sh 
_driverkit:*:270:270:DriverKit:/var/empty:/usr/bin/false
This is my first command
This is my second command
I can even put in other commands besides echo;
ls: /home/_driver/.b*: No such file or directory
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test3.sh 
#! /bin/bash

testuser=_driver

if grep $testuser /etc/passwd    # 如果匹配不到就不会执行then语句
then
    echo "This is my first command"
    echo "This is my second command"
    echo "I can even put in other commands besides echo;"
    ls -a /home/$testuser/.b*
fi
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

12.2 if-then-else语句

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test4.sh 
#! /bin/bash

testuser=sidian

if grep $testuser /etc/passwd
then
    echo "This is my first command"
    echo "This is my second command"
    echo "I can even put in other commands besides echo;"
    ls -a /home/$testuser/.b*
else
    echo "The user $testuser does not exist on this system\n"
   
fi
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

12.3嵌套if

if command

then

      if command

            then

           commands

else

      if command

           then

           commands

fi

还有一种elif格式,跟很多编程语言一样,比较好理解

 

12.4 test命令

前面的if 条件孩子能测试命令退出状态的条件,test可以测试命令状态退出状态码之外的条件

test 用来测试变量中是否有内容

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ a=""
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ b="12"
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test $a
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
1
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test $b
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
0
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 如果写在脚本里面用作判断也非常方便,代码不抄写了,逻辑比较简单

bash shell提供[]的条件测试

if [ condition ]

then

     commands

fi

test与[]的功能相等,可以用来判断

数值比较,字符串比较,文件比较

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test 1 -eq 1
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
0
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ test 1 -eq 2
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
1
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

数值比较

-eq 等于 -ge 大于等于 -gt 大于  -le小于等于  -lt 小于 -ne 不相等

 

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./numeric_test.sh 
The test value 10 is greater than 5
The values are different
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat numeric_test.sh 
#! /bin/bash

value1=10
value2=11
if [ $value1 -gt 5 ]
then
    echo "The test value $value1 is greater than 5"
fi
if [ $value1 -eq $value2 ]
then
    echo "The values are equl"
else
    echo "The values are different"
fi
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

在bash shell只能处理整数,可以通过echo输出变量,但如果条件中,浮点数进行大小比较,就会报错了。

 

字符串比较

str1=str2    检查是否相同  !=不等于   >大于    <小于    -n 检查是否有内容     -z检查是否为空

检查相等

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test7.sh 
Welcome shijianzhong
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test7.sh 
#! /bin/bash

testuer=shijianzhong

if [ $USER=$testuer ]
then
    echo "Welcome $testuer"
fi


shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 检查不相等

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test8.sh 
This is not shijianzh
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test8.sh 
#! /bin/bash

testuer=shijianzh

if [ $USER != $testuer ]
then
    echo "This is not $testuer"
else
    echo "Welcome $testuer"
fi


shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

检查字符串大小,大于,小于号 要记得用转义符号\,比较测试,比较的是ASCII,所以大写字母小于小写字母。sort 命令排序小写字母会先出现

>或<不写转义符号,会当做重定向使用了。

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test9.sh 
baskball is less than hckey
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test9.sh 
#! /bin/bash
val1=baskball
val2=hckey

if [ $val1 \> $val2 ]      # 转义符号不要忘记
then
    echo "$val1 is greater than $val2"
else
    echo "$val1 is less than $val2"
fi

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

字符串大小的检查,-n,检查字符串是否有内容,有内容返回0 -z检查字符串是否为空,空返回0,不添加参数,自动检查是否有内容,有内容返回0,没有定义的变量,属于空

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ $abcd ]
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
1
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ -z $abcd ]
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
0
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ a=""
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ [ $a ]
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ echo $?
1
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

文件比较

Linux是一个万物皆文件的系统,if条件里面的一些参数可以测试文件的类型

除了-e 另外的前提是检查是否存在

-d file 检测文件是否为目录

-e 检查文件是否存在

-f 检查是否是一个文件

-r 检查是否是可读文件

-s 检查不为空的文件 (目录都为非空,只能检测文件)

-w 检测是否可读

-x  检测是否可执行

-O  检查并属当前用户所有

-G 检查file是否存在并且默认组与当前用户相同

file1 -nt file2 检查file1是否比 file2 新    (使用之前最好先检查文件是否存在)

file1 -ot file2 检查file1是否比file2 旧       (同上)

 

符合条件测试

&& and || or,这个跟其他编程差不多

 

if-then的高级特性

用于数学表达式的双括号(())

用于高级字符串处理功能的双方括号 [[]]

 

 

双括号 (( expression ))

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test23.sh 
The suqare of 10 is 100
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test23.sh 
#! /bin/bash

val1=10

if (( $val1 ** 2 > 90))      # >可以直接用在数学表达式,支持**幂运算
then
    (( val2=$val1 ** 2))
    echo "The suqare of $val1 is $val2"
fi
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

使用双方括号

双方括号命令提供了针对字符串的比较的高级特性。

[[ exprission ]]

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test24.sh 
hello shijianzhong
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test24.sh 
#! /bin/bash

if [[ $USER == s* ]]     # 双== ,通配模式
then
    echo "hello $USER"
else
    echo "Sorry, I do not know you"
fi
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

case命令

case与if比较一样

语法格式

case variable in

pattern1 | pattern2) command;;

pattern3)comands;;

*)commands;;

esac

抄写一个书中代码

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test26.sh 
 Welcome shijianzhong
Pleass enjoy you visit
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test26.sh 
#! /bin/bash

case $USER in       # 用关键字in
shijianzhong | barbarna)   # 多条件用|
    echo " Welcome $USER"
    echo "Pleass enjoy you visit";;
testing)    # 第二种情况
    echo "Special testing account";;
*)
    echo "Sorry, you are not allowed here";;
esac

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ vim test26.sh 
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ ./test26.sh 
Sorry, you are not allowed here
shijianzhongdeMacBook-Pro:part_12 shijianzhong$ cat test26.sh 
#! /bin/bash

case $USER in       # 用关键字in
hijianzhong | barbarna)   # 多条件用|
    echo " Welcome $USER"
    echo "Pleass enjoy you visit";;
testing)    # 第二种情况
    echo "Special testing account";;
*)
    echo "Sorry, you are not allowed here";;
esac

shijianzhongdeMacBook-Pro:part_12 shijianzhong$ 

 

小结

学习了if then 扩展可以为 if then elif then else

if 条件下语句产生一个退出状态码为0执行,非0状态码为false不执行

 

posted @ 2020-05-21 16:18  就是想学习  阅读(183)  评论(0编辑  收藏  举报