中的条件测试,的一对破例意况

By admin in 美高梅手机版4858 on 2019年4月11日

正文所选的例证来自于《Advanced
Bash-scripting Gudie》一书,译者 杨春敏
黄毅

本文所选的事例来自于《Advanced
Bash-scripting Gudie》一书,译者 杨春敏
黄毅

《Advanced Bash-scripting Guide》学习(十八):[[ ]]与[ ]的有的奇异情况,bashscripting

中的条件测试,的一对破例意况。正文所选的例子来自于《Advanced Bash-scripting Gudie》一书,译者 杨春敏 黄毅

 

1 例1:
2 [ 1 -eq 1 ] && [ -n "`echo true 1>&2`" ]            #true。1>&2表示将标准输出输出到文件描述符2(标准错误输出:屏幕)
3 [ 2 -eq 2 ] && [ -n "`echo true 1>&2`" ]            #(not output)
4 
5 [ 1 -eq 2 -a -n "`echo true 1>&2`" ]                #true,这是错误的结果,难道是因为单括号数值计算中有两个条件判断吗?
6 7 [[ 1 -eq 2 && -n "`echo true 1>&2`" ]               #(not output),有些-a 或 -o 不正确的情况,显然&&或||要稳妥些

-a 和 -o一般与[ ]使用,如:[ “$exp1” -a “$exp2” ]

&& 和 || 一般与[[ ]] 使用,如:[[ condition1 && condition2 ]]

 

1 例2
2 [ $a == z* ]      #模式匹配:如果$a以a开头,则为true
3 [ $a == "z*" ]    #字符匹配:如果$a的值等于z*,则为true
4 
5 [ $a = z* ]       #file globbing and word splitting 将会发生,什么意思?
6 [ $a = "z*" ]     #字符匹配:如果$a的值等于z*,则为true

上述属于字符串的相比较,只可是==的功用在[[]]和[]中的行为是不相同的。

 

 1 例3
 2 #只能用[[ ]] 可以进行进制转换比较
 3 
 4 decimal=15                                     #十进制
 5 octial=017                                     #八进制
 6 hex=0x0f                                       #十六进制
 7 if [ "$decimal" -eq "$octal" ]
 8 then
 9     echo "$decimal equals $octal"
10 else
11     echo "$decimal is not equal to $octal"     # 15 is not equal to 017
12 fi              
                                                  # 不能用单括号[ ]计算!
13 if [[ "$decimal" -eq "$octal" ]]
14 then
15 echo "$decimal equals $octal"                  # 15 equals 017
16 else
17 echo "$decimal is not equal to $octal"
18 fi                                             # 要用双括号[[ ]]计算!
19 if [[ "$decimal" -eq "$hex" ]]
20 then
21 echo "$decimal equals $hex"                    # 15 equals 0x0f
22 else
23 echo "$decimal is not equal to $hex"           #[[ $hexadecimal ]]也能计算

24 fi 

 

Bash-scripting
Guide》学习(十八):[[ ]]与[ ]的部分尤其情状,bashscripting
本文所选的事例来自于《Advanced Bash-scripting Gudie》一书, 译…

规范测试

认清标准是还是不是符合必要,就要求测试机制来贯彻,shell
中能够使用test命令来测试条件是或不是吻合须要.bash中的测试可分为:
(一) 数值比较测试
(二) 字符串测试
(三) 文件测试

常用的测试方法包涵:
(1) test命令 test expression
(2) [ expression ]
(3) [[ expression ]]

 

 

test 测试命令的用法

用法: test [美高梅手机版4858,expr]

Evaluate conditional expression.
计算条件表达式  
Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR.  Expressions may be unary or binary.  Unary
expressions are often used to examine the status of a file.  There
are string operators as well, and numeric comparison operators.
退出状态为0(真)或1(假)取决于EXPR的测试。 表达式可能是一元或二元的。一元
表达式通常用于检查文件的状态。 也可以做字符串运算符以及数字比较运算符。

File operators文件测试操作:
    单文件测试:  
  -a FILE        True if file exists.  文件是否存在true/false
  -b FILE        True if file is block special.    判断是否是一个块设备文件  
  -c FILE        True if file is character special. 判断是否是一个字符文件  
  -d FILE        True if file is a directory.  判断是否是一个目录  
  -e FILE        True if file exists. 文件存在性测试  
  -f FILE        True if file exists and is a regular file. 文件是否存在并且是一个普通文件  
  -g FILE        True if file is set-group-id.  存在且设置了sgid
  -h FILE        True if file is a symbolic link.  存在且为链接文件  
  -L FILE        True if file is a symbolic link.  存在且为链接文件   
  -k FILE        True if file has its `sticky' bit set. 文件存在且有sticky权限  
  -p FILE        True if file is a named pipe.   是否存在且为命令管道文件  
  -r FILE        True if file is readable by you.  是否可读  
  -s FILE        True if file exists and is not empty.  是否存在且不为空  
  -S FILE        True if file is a socket.  是否是一个socket套接字文件  
  -t FD          True if FD is opened on a terminal.  文件的描述符是否在某个终端打开  
  -u FILE        True if the file is set-user-id.  存在且设置了suid  
  -w FILE        True if the file is writable by you.   当前用户是否有写权限
  -x FILE        True if the file is executable by you. 当前用户是否有写权限  
  -O FILE        True if the file is effectively owned by you. 文件的属主是否是当前用户  
  -G FILE        True if the file is effectively owned by your group. 文件的属组是否是当前组  
  -N FILE        True if the file has been modified since it was last read.  文件自从上一次被读取后是否被修改过  

双文件测试:  
测试文件的新旧
  FILE1 -nt FILE2  True if file1 is newer than file2 (according to
                   modification date).file1是否比file2旧(修改时间戳)

  FILE1 -ot FILE2  True if file1 is older than file2. file1是否比file2新(修改时间戳)  

  FILE1 -ef FILE2  True if file1 is a hard link to file2.file2是否是file1的硬链接,或是是否为同一个文件(文件的inode是同一个) 。  

String operators字符串测试操作符:  
是否为空:  
  -z STRING      是否为空 True if string is empty.

  -n STRING      是否不空  
     STRING      True if string is not empty.
大小测试(按顺序比较anssic码) :  
  STRING1 = STRING2  相等  
                 True if the strings are equal. 
  STRING1 != STRING2 不等于  
                 True if the strings are not equal.
  STRING1 < STRING2  小于  
                 True if STRING1 sorts before STRING2 lexicographically.
  STRING1 > STRING2  大于  
                 True if STRING1 sorts after STRING2 lexicographically.


Other operators其他的测试  :

  -o OPTION      True if the shell option OPTION is enabled.
  ! EXPR         True if expr is false.
  EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
  EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.
  数值大小测试:  
  arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,
                 -lt, -le, -gt, or -ge.
    -eq 等于  
    -ne 不等于  
    -lt 小于  
    -le 小于等于  
    -gt 大于 
    -ge 大于等于  

Arithmetic binary operators return true if ARG1 is equal, not-equal,
less-than, less-than-or-equal, greater-than, or greater-than-or-equal
than ARG2.

Exit Status:
Returns success if EXPR evaluates to true; fails if EXPR evaluates to
false or an invalid argument is given.
1 例1:
2 [ 1 -eq 1 ] && [ -n "`echo true 1>&2`" ]            #true。1>&2表示将标准输出输出到文件描述符2(标准错误输出:屏幕)
3 [ 2 -eq 2 ] && [ -n "`echo true 1>&2`" ]            #(not output)
4 
5 [ 1 -eq 2 -a -n "`echo true 1>&2`" ]                #true,这是错误的结果,难道是因为单括号数值计算中有两个条件判断吗?
6 7 [[ 1 -eq 2 && -n "`echo true 1>&2`" ]               #(not output),有些-a 或 -o 不正确的情况,显然&&或||要稳妥些
1 例1:
2 [ 1 -eq 1 ] && [ -n "`echo true 1>&2`" ]            #true。1>&2表示将标准输出输出到文件描述符2(标准错误输出:屏幕)
3 [ 2 -eq 2 ] && [ -n "`echo true 1>&2`" ]            #(not output)
4 
5 [ 1 -eq 2 -a -n "`echo true 1>&2`" ]                #true,这是错误的结果,难道是因为单括号数值计算中有两个条件判断吗?
6 7 [[ 1 -eq 2 && -n "`echo true 1>&2`" ]               #(not output),有些-a 或 -o 不正确的情况,显然&&或||要稳妥些

其余测试命令:

[ expr ] 表明式前后必供给有空格,不然错误
例如: [ 1 -gt 3 ] && echo “hello” || echo “no hello”
[[ expr ]]
例如: [[ 1 -gt 3 ]] && echo “hello” || echo “no hello”

以上测试命令能够运用同样的操作符

-a 和 -o一般与[ ]使用,如:[ “$exp1” -a “$exp2” ]

-a 和 -o一般与[ ]使用,如:[ “$exp1” -a “$exp2” ]

方式相配测试

STRING1 =~ pattern 左侧的字符串能或不可能被右边的形式相称到,只幸而[[ ]]
中使用
例如: [[ “a.sh” =~ “*.sh” ]] && echo “yew” || echo “no”

&& 和 || 一般与[[ ]] 使用,如:[[ condition1 && condition2 ]]

&& 和 || 一般与[[ ]] 使用,如:[[ condition1 && condition2 ]]

注意

字符串的测试操作必须要带上双引号

 

 

自定义退出状态码

exit [n] 钦定退出状态码
注意:
(1) 脚本中壹旦蒙受exit 命令,脚本会# 立即 #终止。
(2) 脚本的执行状态码是最终一条命令的退出状态码

1 例2
2 [ $a == z* ]      #模式匹配:如果$a以a开头,则为true
3 [ $a == "z*" ]    #字符匹配:如果$a的值等于z*,则为true
4 
5 [ $a = z* ]       #file globbing and word splitting 将会发生,什么意思?
6 [ $a = "z*" ]     #字符匹配:如果$a的值等于z*,则为true
1 例2
2 [ $a == z* ]      #模式匹配:如果$a以a开头,则为true
3 [ $a == "z*" ]    #字符匹配:如果$a的值等于z*,则为true
4 
5 [ $a = z* ]       #file globbing and word splitting 将会发生,什么意思?
6 [ $a = "z*" ]     #字符匹配:如果$a的值等于z*,则为true

重组条件测试

规范构成也叫逻辑运算, 逻辑运算包涵或运算、与运算、取反(非)
使用情势:
(一) 使用运算符连接四个条件表明式
与: condition1 && condition2
或: condition1 || condition2
非: !condition
例如:
(1) [ -e r.pub ] && [ -r r.pub ] && echo “yes” || echo “no”
(2) [ -z “$HOSTNAME” ] && [ “$USER” != “root” ] && echo “you can’t
set hostname” || echo “you can set hostname”

(二)使用命令的参数方式 :
与: -a and condition1 -a condition2
或: -o or condition1 -o condition2
非: ! !condition
例如:
(1) test -e r.pub -a -r r.pub && echo “true” || echo “false”
(2)[ -n hostname -a hostname != “localhost.localdomain” ] && echo
“yes” || echo “no”

如上属于字符串的可比,只可是==的效果在[[]]和[]中的行为是见仁见智的。

如上属于字符串的相比较,只可是==的机能在[[]]和[]中的行为是见仁见智的。

 

 

 1 例3
 2 #只能用[[ ]] 可以进行进制转换比较
 3 
 4 decimal=15                                     #十进制
 5 octial=017                                     #八进制
 6 hex=0x0f                                       #十六进制
 7 if [ "$decimal" -eq "$octal" ]
 8 then
 9     echo "$decimal equals $octal"
10 else
11     echo "$decimal is not equal to $octal"     # 15 is not equal to 017
12 fi              
                                                  # 不能用单括号[ ]计算!
13 if [[ "$decimal" -eq "$octal" ]]
14 then
15 echo "$decimal equals $octal"                  # 15 equals 017
16 else
17 echo "$decimal is not equal to $octal"
18 fi                                             # 要用双括号[[ ]]计算!
19 if [[ "$decimal" -eq "$hex" ]]
20 then
21 echo "$decimal equals $hex"                    # 15 equals 0x0f
22 else
23 echo "$decimal is not equal to $hex"           #[[ $hexadecimal ]]也能计算

24 fi 
 1 例3
 2 #只能用[[ ]] 可以进行进制转换比较
 3 
 4 decimal=15                                     #十进制
 5 octial=017                                     #八进制
 6 hex=0x0f                                       #十六进制
 7 if [ "$decimal" -eq "$octal" ]
 8 then
 9     echo "$decimal equals $octal"
10 else
11     echo "$decimal is not equal to $octal"     # 15 is not equal to 017
12 fi              
                                                  # 不能用单括号[ ]计算!
13 if [[ "$decimal" -eq "$octal" ]]
14 then
15 echo "$decimal equals $octal"                  # 15 equals 017
16 else
17 echo "$decimal is not equal to $octal"
18 fi                                             # 要用双括号[[ ]]计算!
19 if [[ "$decimal" -eq "$hex" ]]
20 then
21 echo "$decimal equals $hex"                    # 15 equals 0x0f
22 else
23 echo "$decimal is not equal to $hex"           #[[ $hexadecimal ]]也能计算

24 fi 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有