shell之条件判断

     在linux下用shell脚本能够方便地解决很多问题,作为初学者,我也只是窥见了其强大功能中小小的一角。

     条件判断,主要包括值的判断和字符串的判断,在shell中还包括对文件的判断。我没有系统的学过shell编程,只是通过一些网上的教程等入了门(当然,是否真的入了门还有待证实),用着用着,我接触到了用于条件判断的 [][[]],以及 test命令,然后我就困惑了,三者差别在哪里?

     在网上荡来荡去,一直找不到令我信服的答案(或许找本教材比较能够解决问题)。最后,在一个类似于谷歌的网站上用英文搜索,终于在stackoverflow上看到了同样的问题,并最终通过网友推荐看到了这个网页,我觉得我的问题应该得到了解答。

     [][[]] 都是用于测试表达式的命令,不过后者较“新”而且更强大,但其兼容性不如前者,只能在Bash、Zsh和KornShell中使用。而 [] 可以在所有的POSIX shell中使用。

     几乎在所有的shell(最早的Bourne Shells除外)中,[]test 命令是等同的。

     [[]] 可以看做是[] 的扩展,其使用更为灵活,而且能够支持更多的操作。现将一些使用上的差别总结如下:

  • < 和 > :在 [] 中使用 < 或者 > ,必须使用转义字符,否则会被解释为重定向符号,而在 [[]] 中,可以直接使用。

  • 逻辑 :在 [[]] 中可以直接使用 && 和 || ,而在 [] 内部是不能直接使用这两个逻辑符号的,当然,在 [] 内部可以通过 -a 或者 -o 来判断逻辑关系,但是这两个操作符已经被弃用了(目前还是可以使用的),&& 和 ||只能在 [] 之间使用,如
    [ "\$a" = a ] && [ "\$b" = b ]

  • 关于变量空格的问题:如果变量本身包含空格,在 [] 中必须通过引号引起来才能作为一个整体,而在 [[]] 中,则可以直接使用

  • 在比较字符串时, [[]] 中可以使用==,而 [] 中不能使用==

  • [[]] 中可以使用正则表达式, [] 中不能使用正则表达式

     何时使用 [] ,何时使用 [[]] 呢?经验说,如果不需要考虑代码的可移植性,那么 [[]] 是一个不错的选择,因为它的使用更加灵活,使用过程中也不容易出错。可是如果可移植性是一个不得不考虑的问题,那还是老老实实用 [] 吧。如果是测试整数表达式,或许,你还可以试试使用算术表达式


     最后,来看看条件表达式都有哪些吧!(以下内容摘自test命令的手册)

1、整数判断
int1 -eq int2 int1 is equal to int2
int1 -ge int2 int1 is greater than or equal to int2
int1 -gt int2 int1 is greater than int2
int1 -le int2 int1 is less than or equal to int2
int1 -lt int2 int1 is less than int2
int1 -ne int2 int1 is not equal to int2
2、字符串判断
-n str the length of str is nonzero
-z str the length of str is zero
str1 = str2 the strings a equal
str1 != str2 the strings are not equal
3、文件判断
file1 -ef file2 file1 and file2 have the same device and inode numbers
file1 -nt file2 file1 is newer than file2
file1 -ot file2 file1 is older than file2
-b file file exists and is block special
-c file file exists and is character special
-d file file exists and is a directory
-e file file exists
-f file file exists and is a regular file
-h file file exists and is a symbolic link (same as -L)
-L file file exists and is a symbolic link (same as -h)
-p file file exists and is a named pipe
-r file file exists and read permission is granted
-s file file exists and has a size greater than zero
-S file file exists and is a socket
-t fd file descriptor fd is opened on a terminal
-w file file exists and write permission is granted
-x file file exists and execute (or search) permission is granted
4、逻辑判断
expression expression is true
! expression expression is false
expr1 -a expr2 both expression1 and expression2 are true
expr1 -o expr2 either expression1 or expression2 is true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Shell脚本条件判断是指在脚本中根据不同的条件执行不同的操作。常用的条件判断语句包括if、elif和else等。在脚本中,可以使用各种比较运算符(如等于、不等于、大于、小于等)来比较不同的值,从而确定执行哪个分支。另外,还可以使用逻辑运算符(如与、或、非等)来组合多个条件,实现更加复杂的判断逻辑。在编写Shell脚本时,条件判断是非常重要的一部分,可以帮助我们实现更加灵活和智能的脚本功能。 ### 回答2: Shell脚本是一种在Unix或Linux操作系统上编写的脚本语言,它可以通过简单的命令和语法实现复杂的自动化任务。在编写Shell脚本时,经常需要根据条件来确定程序的执行路径。这时就需要用到Shell脚本中的条件判断Shell脚本中的条件判断主要包括if语句、case语句和test命令。其中,if语句是最常用的条件判断语句,它的语法结构为: ``` if 条件 then 命令 else 命令 fi ``` 其中,条件可以是一个表达式,也可以是一个命令。如果条件成立,就执行then后面的命令,否则执行else后面的命令。 除了if语句,Shell脚本中还有一个常用的条件判断语句是case语句。它的语法结构为: ``` case 变量 in 模式1) 命令1;; 模式2) 命令2;; *) 命令3;; esac ``` 其中,变量是需要判断的变量,模式是用来判断变量值是否符合要求的规则,如果符合,就执行对应的命令。如果变量值不符合任何一个模式,就执行星号*后面的命令。 另外,Shell脚本中还有一个常用的条件判断命令是test命令,该命令用于测试文件类型、文件权限、字符串和数值等各种条件。例如: ``` if test -f "file.txt" then 命令 fi ``` 上面的代码用于判断是否存在一个名为file.txt的文件。 综上所述,Shell脚本中的条件判断能够实现根据不同情况进行分支执行的功能,从而实现更加灵活的程序逻辑控制。需要注意的是,在编写脚本时,应该根据具体情况选择合适的条件判断语句或命令,以及正确地书写语法结构,避免因语法错误或逻辑错误导致程序异常或运行结果错误。 ### 回答3: 在shell脚本中,条件判断是非常重要的一个功能。在实际的开发中,我们需要根据不同的情况进行不同的处理。比如,当某个变量的值满足某个条件时,我们需要执行某段代码,否则我们需要执行另外一段代码。这时候,就需要使用条件判断Shell脚本中常见的条件判断语句有if-else语句和case语句。其中,if-else语句用于判断某个条件是否成立,如果成立,就执行某段代码。如果不成立,就执行另一段代码。if-else语句的语法如下: ```bash if [条件判断语句]; then 某段代码 else 另一段代码 fi ``` 需要注意的是,if后面的条件判断语句需要放在方括号中,并且方括号两边需要空格。另外,if和then之间也需要空格,否则会报语法错误。 如果需要判断多个条件,我们可以使用elif语句。elif相当于其他语言中的else if,用于判断第二个条件是否成立。示例如下: ```bash if [条件1]; then 某段代码 elif [条件2]; then 另一段代码 else 最后一段代码 fi ``` 需要注意的是,elif之前同样需要加上if和then,elif和then之间也需要空格。 另一种条件判断语句是case语句,用于类似于多重if-else的场合。case语句的语法如下: ```bash case 变量 in 模式1) 执行的代码 ;; 模式2) 执行的代码 ;; *) 默认执行的代码 ;; esac ``` 需要注意的是,case语句和esac需要单独成行,并且每个分支需要以模式开头,然后跟着一段代码。每个分支的代码需要以两个分号结束。最后的默认执行代码需要放到一个星号后面,以保证匹配不到任何模式时执行这段代码。 在条件判断中,比较常见的操作符有-eq、-ne、-lt、-le、-gt、-ge、-z、-n等。其中-eq表示等于,-ne表示不等于,-lt表示小于,-le表示小于等于,-gt表示大于,-ge表示大于等于,-z表示空字符串,-n表示非空字符串。使用这些操作符可以对变量进行比较,从而进行条件判断。 最后,需要注意的是,条件判断语句中的变量名需要使用$符号括起来,否则会被当做字符串处理,而非变量名。例如: ```bash if [$a -eq 1]; then ... fi ``` 在这个例子中,$a被当做字符串处理,程序会报语法错误。应该写成: ```bash if [$a -eq 1]; then ... fi ``` 这样$a才会被正确识别为变量名。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值