淘先锋技术网

首页 1 2 3 4 5 6 7

一、条件测试

1.条件测试的基本语法

在Shell程序中,用户可以使用测试语句来测试指定的条件表达式的真假。当指定条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非零。

条件测试的语法有两种,分别是test命令和[命令,下面介绍他们的语法:
【1】test命令的语法如下:

test expression
其中,expression表示需要进行测试的条件表达式,可以由字符串、整数、文件名,以及各种运算符组成。

例如,下面的表达式都是有效的条件表达式:

  • 1 -eq 2
  • ‘string’
  • -z ‘string’
  • -e file

【2】[命令的语法如下:
[ expression ]

  [命令的作用与test相同,为了增加程序的可读性,Shell要求在条件表达式后面追加一个方括号]来与前面的[命令配对。

注意:在Shell中命令与参数之间必须保留一个空格,因此,在上面的语法中,expression与左右两个括号之间也必须保留一个空格。

2.字符串测试

在Shell中用户可以通过5种运算符来对字符串进行操作,如下表:

运算符说明
string判断指定的字符串是否为空
string1 = string2判断两个字符串string1和string2是否相等
string1 != string2判断两个字符串string1和string2是否不相等
-n string判断string是否为非空字符串
-z string判断string是否为空串

注意:在给变量赋值的时候等号两边不能有空格,否则Shell会把空格前面的字符串当作Shell命令。

3.整数测试

与字符串测试类似,整数测试也有两种形式的语法
test number1 op number2
或者
[ number1 op number2 ]
下表列出了常见的整数运算符:

运算符说明
number1 -eq number2number1 等于 number2
number1 -ne number2number1 不等于 number2
number1 -gt number2number1 大于 number2
number1 -lt number2number1 小于 number2
number1 -ge number2number1 大于等于 number2
number1 -le number2number1 小于等于 number2

其实这里的option都是英文字母的缩写,记住英文字母也就记住了这些操作符。

4.文件测试

文件测试的语法如下:
test op file
或者
[ op file ]
常见的文件操作符如下表:

运算符说明
-a file文件是否存在
-b file文件是否存在,且类型为块文件
-c file文件是否存在,且类型为字符文件
-d file文件是否存在,且类型为目录
-e file同-a操作
-s file文件长度是否大于0或者文件是否为非空文件
-f file文件是否存在且为常规文件。
-w file文件是否存在且可写
-L file文件是否存在,并且为符号链接。
-u file文件是否设置suid位
-r file文件是否存在,并且可读
-x file文件是否存在,并且可执行

5.逻辑操作符

运算符说明
! expression逻辑非
expression1 -a expression2逻辑与
expression1 -o expression2逻辑或

二、条件判断语句

1.if 语句

if语句的语法如下:

if  expression
then
    statement1
    statement2
    ....
fi

为了使代码更加紧凑,我们可以将if子句和then子句写在一行:

if  expression; then
    statement1
    statement2
    ....
fi

应用一下if语句:

#!/usr/bin/env bash

# 使用条件测试判断100是否大于20
if [ 100 -gt 20 ]; then
    echo "100大于20"
fi

#使用空命令作为条件
if :; then echo "always true"; fi

#使用&&代替if语句
test "$(whoami)" != "root" && ( echo "You are not root")

Output:

$ sh test.sh
100大于20
always true
You are not root

在示例中提到了空命令:,空命令的退出退出状态永远是0,另外例子中出现了勇&&代替if语句的用法,在该语句中,首先是一个test语句,当该语句为真时,则执行&&后面的语句,当该语句为假时则不执行&&后面的语句。

2.if else 语句

if else语句的语法如下:

if  expression
then
    statement1
    statement2
    ....
else
    statement1
    statement2
    ....
fi

这里的使用方法和if类似,就不举例了。

3.if elif 语句

if else语句的语法如下:

if  expression
then
    statement1
    statement2
    ....
elif expression2
then
    statement1
    statement2
    ....
else
    statement1
    statement2
    ....
fi

4.使用exit语句退出程序

语法为: exit status
status是退出状态,该参数是一个整数,取值范围为0-255,与其他shell一样,退出状态存储在 ? 中 , 因 此 用 户 可 以 通 过 ?中,因此用户可以通过 ??判断程序执行状态。

#!/usr/bin/env bash

echo "hello world"
exit 100

Output:

random@random-wz MINGW64 /d/GOCODE/api-test
$ sh test.sh
hello world

random@random-wz MINGW64 /d/GOCODE/api-test
$ echo $?
100

三、多条件判断语句case

case的语法如下:

case variable in
value1)
     statement1
     statement2
     ....;;
value2)
     statement1
     statement2
     ....;;
*)
    statement1
    statement2
    ......;;
esac

在case语句中有下面三点需要注意:

  • 对于变量名variable,可以使用双引号也可以不使用双引号。
  • 每个case语句的条件测试部分,都以右括号“)”结束。
  • 每个case子句都以一对分号作为结束符。
  • case语句结构以esac结尾。

四、运算符

1. 算术运算符

与其他程序设计语言类似,Shell也可以使用算数运算符,如下表:

运算符说明
+求两个数的和
-两个数做差
*两个数相乘
/求两个数的商
%求余
**幂运算

Shell同样也支持复合算数运算符:

运算符说明
+=将左边的数加上右边的数,然后再将和赋值给左边的变量。
-=将左边的数减去右边的数,然后再将差赋值给左边的变量。
*/将左边的数乘以右边的数,然后再将积赋值给左边的变量。
/=将左边的数除以右边的数,然后再将商赋值给左边的变量。
%=将左边的数对右边的数求模,然后再赋值给左边的变量。
1.1 使用expr外部程序

语法为:expr expression
其中expression为要计算的表达式,需要注意的是运算符两边要有空格,并且需要对*、()进行转义另外,expr不支持幂运算

#!/usr/bin/env bash

# 计算100-2
result=`expr 100 - 2`
echo ${result}

# 计算 100✖10
result=`expr 100 \* 10`
echo ${result}

# 计算 100/10
result=`expr 100 / 10`
echo ${result}

# 计算(100 + 1)* 10
result=`expr \( 100 + 1 \) \* 10`
echo ${result}

Output:

$ sh test.sh
98
1000
10
1010
1.2 使用$((…))

使用这种形式来进行算数运算写法比较自由,无需对运算符和括号做转义,在运算符两边也可以不加空格,允许采用松散或者紧凑的格式书写表达式。

#!/usr/bin/env bash

# 计算100-2
result=$((100 - 2))
echo ${result}

# 计算 100✖10
result=$(( 100 * 10 ))
echo ${result}

# 计算 100/10
result=$((100 / 10))
echo ${result}

# 计算(100 + 1)* 10
result=$(( ( 100 + 1 ) * 10))
echo ${result}

Output:

$ sh test.sh
98
1000
10
1010
1.3 使用$[…]

使用一个方括号同样可以执行算术运算,这种语法与使用双括号是一样的,可以采用松散或者紧凑的格式书写表达式,也不需要对特殊符号进行转义。

#!/usr/bin/env bash

# 计算100-2
result=$[100 - 2]
echo ${result}

# 计算(100 + 1)* 10
result=$[ ( 100 + 1 ) * 10]
echo ${result}

Output:

$ sh test.sh
98
1010

1.4 使用let命令

使用let命令可以执行一个或者多个计算表达式,其中变量名不需要使用$符号,如果表达式中含有空格或者其他特殊字符,则必须将其引用起来。

#!/usr/bin/env bash

# 定义变量
num=10

# 加法运算
let num=num+1
echo "$num"

# 乘法运算
let num=num*10
echo "$num"

# 幂运算
let num=num**2
echo "$num"

Output:

$ sh test.sh
11
110
12100

2. 位运算符

对于Shell编程位运算符用的比较少,这里只做简单介绍,主要的位运算符如下表:

运算符说明
<<左移
>>右移
&按位与
~按位非
^按位异或

同样位运算符也支持复合运算:

运算符说明
<<=变量左移后重新赋值给该变量
>>=变量右移后重新赋值给该变量
&=变量按位与后重新赋值给该变量
~=变量按位非后重新赋值给该变量
^=变量按位异或后重新赋值给该变量

3. 自增、自减运算符

运算符说明
++variable先对变量值加一,然后赋值给variable
–variable先对变量值减一,然后赋值给variable
variable++先使用variable的值,然后再将该变量的值加一
variable–先使用variable的值,然后再将该变量的值减一

4.数字常量的进制

Shell总是以十进制来表示数字,但是用户也可以使用其他进制的数字,如以0开头表示八进制,以0x开头表示十六进制。当然也可以通过#注明进制,如2#1000表示二进制,8#100表示八进制。