十八、Shell-Script(中)

king's blog
Shell中的条件测试非常重要,尤其在编写shell脚本中尤其如此,如有时要判断字符串是否相等,可能还要检查文件状态或是数字测试,基于这些测试才能做进一步动作等等,比如:
test:用于测试文件状态,字符串和数字,也很适合if、then、else条件结构
expr:常用于数字、字符串等、及测试和执行数值输出,使用最后退出状态命令
$?  :可获取test和expr执行结果,二者均以0表示正确,1表示返回错误
那该节我们就聊一聊这方面的内容,主要内容如下:
一、test和[]
二、expr
三、$?、$#、$@、$*、$1

一、test和[]

linux下可可通过test和[]进行条件测试,格式分别如下:
方式一:test 参数 内容
比如:test -d /opt (判断/opt目录是否存在)

方式二:[ 参数 内容 ]
比如:[ -d /opt ] (判断/opt目录是否存在),需要注意[]中间必须有空格

参数类型主要有以下几种:

1、判断文档类型

参数如下:
-e 判断该文档是否存在
-f 判断该文档是否为file
-d 判断该文档是否为directory
-b 判断该文档是否为二进制文件
例子:

1
2
3
4
5
6
7
8
9
10
11
#1.利用test进行测试,判断/opt目录是否存在,存在则返回0,否则返回1
weblogic@ETS157:~> test -d /opt ; echo $?
0
weblogic@ETS157:~> test -d /opterr ; echo $?
1

#2.利用[]进行测试,判断/opt目录是否存在,存在则返回0,否则返回1
weblogic@ETS157:~> [ -d /opt ] ; echo $?
0
weblogic@ETS157:~> [ -d /opterr ] ; echo $?
1
2、判断文档权限

参数如下:
-r 该文档是否有【可读】权限
-w 该文档是否有【可写】权限
-x 该文档是否有【可执行】权限
-u 该文档是否有【SUID】权限
-g 该文档是否有【SGID】权限
-k 该文档是否有【Sticky bit】权限
-s 该文档是否是【非空白文档】
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
weblogic@ETS157:~> ll updated_ip.sh
-rwxr--r-- 1 weblogic wasgroup 846 Jun  6  2016 updated_ip.sh

#1.判断当前登陆用户weblogic,判断是否对updated_ip.sh文件有写的权限,有w权限,返回0
weblogic@ETS157:~> test -w updated_ip.sh ; echo $?
0

#2.判断updated_ip.sh文件是否为非空文件,注意是非空,该文件有内容,则返回0
weblogic@ETS157:~> test -s updated_ip.sh ; echo $?
0

#3.判断testfile文件是否为非空文件,是空文件,返回1
weblogic@ETS157:~> touch testfile ; test -s testfile ; echo $?
1
3、文档比较

比如:test file1 -nt file2
参数如下:
-nt 判断file1是否比file2新
-ot 判断file1是否比file2旧
-ef 判断file1、file2是否为同一文档
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
weblogic@ETS157:~> ll updated_ip.sh  testfile
-rw-r--r-- 1 weblogic wasgroup   0 Mar  9 09:04 testfile
-rwxr--r-- 1 weblogic wasgroup 846 Jun  6  2016 updated_ip.sh

#1.判断testfile是否比updated_ip.sh文件新,是则返回0
weblogic@ETS157:~> test testfile -nt updated_ip.sh ; echo $?
0

#2.判断两个文件是否为同一个文件,是则返回0
weblogic@ETS157:~> test testfile -ef updated_ip.sh ; echo $?
1
weblogic@ETS157:~> test updated_ip.sh -ef updated_ip.sh ; echo $?
0

#3.判断软连接的文件,是否为同一文件
weblogic@ETS157:~> ln -s testfile test1  #创建软连接,相当于快捷方式
weblogic@ETS157:~> ll test*
lrwxrwxrwx 1 weblogic wasgroup 8 Mar  9 09:17 test1 -> testfile
-rw-r--r-- 1 weblogic wasgroup 0 Mar  9 09:04 testfile
weblogic@ETS157:~> test testfile -ef test1 ; echo $?
0
4、整数比较

参数如下:

  • -eq 判断两数字相等
  • -ne 判断两数字不相等
  • -gt 判断n1>n2
  • -lt 判断n1<n2
  • -ge 判断n1>=n2
  • -le 判断n1<=n2

例子:

1
2
3
4
5
6
7
#1.判断3<5,是则返回0
weblogic@ETS157:~> test 3 -lt 5 ; echo $?
0

#2.判断3<=5,是则返回0
weblogic@ETS157:~> test 3 -le 5 ; echo $?
0
5、字符串比较

test -z string(测试字符串是否为空,则true)
test -n string(测试字符串为非空,则true))
test str1 = str2(测试字符串是否相等,则true)
test str1 != str2(测试字符串是否不相等,则true)
-a(And关系)
-o(Or关系)
!(反向)

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#1.判断是否为空字符串,是则返回0
weblogic@ETS157:~> test -z "" ; echo $?
0

#2.判断是否为非空字符串,是则返回0
weblogic@ETS157:~> test -n "a" ; echo $?
0

#3.判断字符串是否相等,是则返回0,否则返回1
weblogic@ETS157:~> test "abc" = "ABC" ; echo $?
1

#4.多个判断条件,判断updated_ip.sh是否同时具有rx权限
weblogic@ETS157:~> ll updated_ip.sh
-rwxr--r-- 1 weblogic wasgroup 846 Jun  6  2016 updated_ip.sh
weblogic@ETS157:~> test -r updated_ip.sh -a -x updated_ip.sh ; echo $?
0

#5.反向判断,判断updated_ip.sh没有x权限,是则返回0,否则返回1
weblogic@ETS157:~> test ! -x updated_ip.sh ; echo $?
1

二、expr

格式:expr argument operator argument
作用:expr也是一个手动命令计数器,各计算值之间需用空格隔开
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
weblogic@ETS157:~> expr 12+3
12+3

weblogic@ETS157:~> expr 12 + 3
15

weblogic@ETS157:~> expr 12 \* 3
36

#判断字符串是否相等,结果为真,返回1  <与test不同>  
weblogic@ETS157:~> expr "a" = "a"
1

weblogic@ETS157:~> b=`expr 1 + 1`
weblogic@ETS157:~> echo $b
2

三、$?、$#、$@、$*、$1

$?:代表上命令执行结果,true则返回0;fail返回非0
$#:返回参数个数
$@:返回所有的参数值,每个参数值以””括起来,比如”a”、”b”、”c”
$*:返回所有的参数值,以空格分隔,比如:”a b c”
$1:代表第一个参数
$2:代表第二个参数
$0:代表脚本本身

例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
weblogic@ETS157:/opt/project> cat seconcd.sh
#!/bin/bash

echo "the number of parameter is: " $#
echo "all parameter is: " $@
echo "all parameter is: " $*
echo "the first parameter is: " $1
echo "the second parameter is: " $2
echo "the script name is: " $0

weblogic@ETS157:/opt/project> ./seconcd.sh 1 2 3 4 5 6
the number of parameter is:  6
all parameter is:  1 2 3 4 5 6
all parameter is:  1 2 3 4 5 6
the first parameter is:  1
the second parameter is:  2
the script name is:  ./seconcd.sh
Tags:
文 / 甲乙丙丁
LEAVE A REPLY

loading