从零开始学shell之结构化命令

shell Feb 11, 2019

一、前言

在shell脚本中我们会需要控制程序的走向或者根据条件使脚本跳过某些指令。这样的命令通常称为结构化命令。

二、结构化命令

2.1 if-then语句

if command 
then 
   command
fi

bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行) ,位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then在部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。fi语句用来表示if-then语句到此结束。

例子:

#!/bin/bash
# testing the if statement
if pwd
then
echo "It worked"
fi

如果pwd运行成功了,那么就会打印出 It worked。

if-then语句的另一种形式:

if command; then
commands
fi

if-then-else语句

if-then-else语句,提供了命令不返回0时的另一种选择。

if command
then
commands
else
commands
fi

例子:

#!/bin/bash
# testing the else section
#
testuser=NoSuchUser
#
if grep $testuser /etc/passwd
then
echo "The bash files for user $testuser are:"
ls -a /home/$testuser/.b*
echo
else
echo "The user $testuser does not exist on this system."
echo
fi

嵌套if和elif

我们可以再if-then中嵌套使用if。但是这样会让shell的可读性降低。可以使用else部分的另一种形式:elif。这样就不用再书写多个if-then语句了。

if command1
then
commands
elif command2
then
more commands
fi

Ps: 在elif语句中,紧跟其后的else语句属于elif代码块。它们并不属于之前的
if-then代码块。

test命令

想要在if-then中实现类似编程语言的if语句,需要借助test命令。

test命令格式:
test condition

在if-then中使用:
if test condition
then
commands
fi

bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令

if [ condition ]
then
commands
fi

ps: condition和两个中括号之间要用空格隔开,否则会报错。

test命令可以判断三类条件:

  1. 数值比较
  2. 字符串比较
  3. 文件比较

数值比较

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

字符串比较

参数 描述
str1 = str2 检查str1是否和str2相同
str1 != str2 检查str1是否和str2不同
str1 < str2 检查str1是否比str2小
str1 > str2 检查str1是否必str2大

ps:大于号和小于号必须转义,否则shell会把他们当作重定向符号,把字符串当作文件名。

ps:我们经常会遇到判断变量是否正确赋值的情况。可以通过-n和-z条件参数来进行判断

参数 描述
-n var 变量长度为非0时 true,为0时 false
-z var 变量长度为0时 true 非0时 false。未定义变量的长度默认为0
ps:
-n的格式 [ -n "$var" ]
-z的格式 [ -z $var ]
-n比较的时候需要加上双引号才行

文件比较

文件比较是shell编程中用的最多的,最为强大的形式。

参数 描述
-d file 检查file是否存在并是一个目录
-e file 检查file是否存在,也就是检查file代表的目录或文件是否存在
-f file 检查file是否存在并是一个文件
-r file 检查file是否存在并可读
-s file 检查file是否存在并非空
-w file 检查file是否存在并可写
-O file 检查file是否存在并属于当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

复合条件测试

if-then语句允许你使用布尔逻辑用来组合测试。有两种布尔运算符可用:

  • [condition1] && [condition2]
  • [condition1] || [condition2]
    第一种是And布尔运算符,必须两个条件都满足才能继续执行then部分命令。
    第二种是Or布尔运算符,两个里面只要有一个满足条件就可以继续执行then部分命令。

case命令

case命令的格式:

case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac

使用case命令提供了一个更清晰的方法来为变量每个可能的值指定不同的选项。

总结

这次总结了shell的简单结构化命令,下次学习for,while,until等结构化命令。

zzx

There is my place for writing,coding and reading