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.


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shell脚本学习指南是一本介绍Shell脚本编程的书籍,其涵盖了Shell脚本的基础语法、控制结构、变量和数组、函数、正则表达式、文本处理、调试技巧等内容。这本书还介绍了常见的Unix/Linux命令,如grep、awk、sed等,并给出了一些例子来演示这些命令的使用方法。这本书适合那些想要学习Shell脚本编程的初学者,也适合那些已经有一些编程经验的人。如果您想学习Shell脚本编程,这本书是一个不错的选择。 是的,您是正确的。我的回答是关于《Shell脚本学习指南》这本书的介绍。它是一本介绍Shell脚本编程的书籍,适合初学者和有一些编程经验的人学习。该书涵盖了Shell脚本的基础语法、控制结构、变量和数组、函数、正则表达式、文本处理、调试技巧等内容,并介绍了常见的Unix/Linux命令和它们的使用方法。如果您想学习Shell脚本编程,这本书是一个不错的选择。好的,以下是关于Shell脚本学习的指南: Shell是一种命令行解释器,它可以解释执行用户输入的命令并与操作系统进行交互。Shell脚本则是由一系列Shell命令组成的脚本文件,可以实现批量处理、自动化脚本等功能。学习Shell脚本可以提高工作效率,尤其是在Linux和Unix系统下。 以下是Shell脚本学习的指南: 1. 学习Shell语法和基本命令。了解Shell的语法、变量、循环、条件判断、函数等基本语法结构,同时掌握常用的Shell命令,例如ls、cd、mkdir、rm、cp等。 2. 编写简单的Shell脚本。通过编写一些简单的脚本,例如输出hello world、实现文件的复制、批量处理文件等,来熟悉Shell脚本的语法和命令。 3. 学习Shell脚本高级特性。掌握Shell脚本的高级特性,例如正则表达式、awk、sed、grep等,可以让脚本更加强大和灵活。 4. 掌握Shell脚本调试技巧。学会使用调试工具和技巧,例如set -x、set -e、调试器等,可以快速定位脚本中的错误并进行调试。 5. 学习Shell脚本编程风格和规范。编写规范的Shell脚本可以提高代码的可读性、可维护性和可重用性,例如变量命名规范、缩进风格、注释规范等。 6. 练习实战项目。通过编写一些实际的项目,例如备份脚本、日志分析脚本、系统监控脚本等,来提高自己的Shell脚本编程水平。 希望这些指南对您学习Shell脚本有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值