shell 脚本——判断条件

在之前的shell语言学习笔记中已经写过shell的几种判断语句及循环语句,也简单的介绍了shell语言判断语句和判断条件。在此再做进一步学习。

test命令的测试功能

test命令用于检测系统文件及其相关属性,如检查某文件是否存在,检查某文件的权限等。判断当前目录下是否存在某文件study可以用以下命令:

1
#test -e study

-e 选项是测试某文件是否存在(包括文件和文件夹),该执行结果不会输出任何信息,但是我们可以通过&&及||来改写使其展现相关信息,改写后的命令如下:

1
#test -e study && echo "exist!" || echo "not exist!"

该命令的作用就是当study文件存在时就输出字符串”exist!”,当不存在时就输出字符串”not exist!”

以下是test命令常用的测试标志:

1. 某文件名的类型检测(存在与否及文件类型)(test -e filename)

-e :该“文件名”是否存在。
-d :该文件名是否为目录。
-f  :该文件名是否为普通文件。
b,c,S,p,L分别指的是块设备、字符设备、套接字文件、管道文件及链接文件。

2. 文件权限的检测(test -r filename)

-r :该文件是否具有可读属性
-w :该文件是否具有可写属性
-x :该文件是否具有可执行属性
-s  :该文件是否为非空白文件

3. 比较两个文件(test file_a nt file_b)

-nt :文件file_a是否比file_b新
-ot :文件file_a是否比file_b旧
-ef :判断两个文件是否为同一文件,可用于判断硬连接。(主要判断两个文件是否均指向同一个inode)

4. 两个整数之间的判断(test n1 -eq n2)

-eq :两个数相等(equal)
-ne :两个数不相等(not equal)
-gt :前者大于后者(greater than)
-lt :前者小于后者(less than)
-ge :前者大于等后者
-le :前者小于等于后者

5. 判断字符串

test -z str :判断字符串是否为空,若为空则回传true
test -n str :判断字符串是否为非空,左路为非空则回传true(-n亦可省略)
test str_a = str_b及test str_a != str_b:判断两字条串是否相等及不相等。

6. 多重判断条件(test -r file -a -w file)

-a :and,当两个条件都满足时才回传true,即file具有读和写权限
-o : or,当两个条件满足其一时即回传true
-! :条件求反,test -! -x file,即当file不具有执行权限时才回传true

下面是两个简单的shell脚本,判断其功能:

1
2
3
4
#!/bin/bash
echo "Please input a filename:"
read -e filename
(test -e $filename && (test -d $filename && echo "directory" ||( test -f $filename && echo "regular")) )||echo "$filename does not exist"
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
echo -e "The program will show you that filename is exist which input by you."
read -p "Input a filename:" filename
test -z $filename && echo "You must input a filename." && exit 0
test ! -e $filename && echo "The filename $filename DO NOT exist" && exit 0
test -f $filename && filetype="Regulare file"
test -d $filename && filetype="directory";
test -r $filename && perm="readable"
test -w $filename && perm="$perm writable"
test -x $filename && perm="$perm executable"
echo "The filename:$filename is a $filetype"
echo "And the permission are:$perm"

使用判断符号[ ]

可以使用判断符号进行数据的判断,如检查某变量是否为空 [ -z $SHELL ],需要注意的是中括号(“[]”)内的组件必须以空格隔开。有以下脚本:

1
2
3
4
5
#!/bin/bash
read -p "input you choice:" choice
[ "$choice" == "y" ] || [ "$choice" == "Y" ] && echo "OK,continue" && exit 0
[ "$choice" == "n" ] || [ "$choice" == "N" ] && echo "Oh,interrupt!" && exit 0
echo "I don't know what is your choice" && exit 0

注:这些内容是参考的《鸟哥的Linux私房菜》一书中的部分章节。

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

整数比较

-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:((”$a” > “$b”))
>= 大于等于(需要双括号),如:((”$a” >= “$b”))

字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以”z”开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
一点解释,关于File globbing是一种关于文件的速记法,比如”*.c”就是,再如~也是.
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" /< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" /> "$b" ]
注意:在[]结构中”>”需要被转义.
具体参考Example 26-11来查看这个操作符应用的例子.
-z 字符串为”null”.就是长度为0.
-n 字符串不为”null”
注意:
使用-n在[]结构中测试必须要用”"把变量引起来.使用一个未被”"的字符串来使用! -z
或者就是未用”"引用的字符串本身,放到[]结构中。虽然一般情况下可
以工作,但这是不安全的.习惯于使用”"来测试字符串是一种好习惯.

二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.

整数比较

-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:((”$a” > “$b”))
>= 大于等于(需要双括号),如:((”$a” >= “$b”))

字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意:==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以”z”开头(模式匹配)那么将为true
2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
3
4 [ $a == z* ] # File globbing 和word splitting将会发生
5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
一点解释,关于File globbing是一种关于文件的速记法,比如”*.c”就是,再如~也是.
但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
!= 不等于,如:if [ "$a" != "$b" ]
这个操作符将在[[]]结构中使用模式匹配.
< 小于,在ASCII字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" /< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" /> "$b" ]
注意:在[]结构中”>”需要被转义.
具体参考Example 26-11来查看这个操作符应用的例子.
-z 字符串为”null”.就是长度为0.
-n 字符串不为”null”
注意:
使用-n在[]结构中测试必须要用”"把变量引起来.使用一个未被”"的字符串来使用! -z
或者就是未用”"引用的字符串本身,放到[]结构中。虽然一般情况下可
以工作,但这是不安全的.习惯于使用”"来测试字符串是一种好习惯.

shell中条件判断if中的-z到-d的意思

[ -a FILE ] 如果 FILE 存在则为真。

[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。

[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。

[ -d FILE ] 如果 FILE 存在且是一个目录则为真。

[ -e FILE ] 如果 FILE 存在则为真。

[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。

[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。

[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。

[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。

[ -r FILE ] 如果 FILE 存在且是可读的则为真。

[ -s FILE ] 如果 FILE 存在且大小不为0则为真。

[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。

[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。

[ -x FILE ] 如果 FILE 存在且是可执行的则为真。

[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。

[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。

[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。

[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。

[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。

[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。

[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。

[ -z STRING ] “STRING” 的长度为零则为真。

[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。

[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。

[ STRING1 != STRING2 ] 如果字符串不相等则为真。

[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。

[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。

[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

上一篇:from提交表单后 数据提交到后台 但不跳转页面 可用iframe


下一篇:js杨辉三角控制台输出