xml地图|网站地图|网站标签 [设为首页] [加入收藏]
来自 每日资讯 2019-10-05 00:45 的文章
当前位置: 新濠国际登录平台 > 每日资讯 > 正文

命令提供了,许多程序在脚本命令之间需要某种

bash shell中测试命令

bash shell中测试命令,bashshell测试命令

bash shell中测试命令

    test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回退出状态吗0 。这样if-than语句就与其他编程语言中的if-than语句类似的方式工作了。如果条件不成立,test命令就会退出并返回非零的退出状态码,使得if-than语句不会被执行。

1    test 命令的基本格式

    test        condition

        conditiontest命令要测试的一系列参数和值。

2用在if-than语句中,格式是这样的:

        if     test     condition

        then

            commands

        fi

    如果不写condition部分,它会以非零的退出状态码退出。then 语句块不会被执行,并执行else语句块。

[[email protected] data]# cat test6.sh
#!/bin/bash
#
if    test
then
    echo "No expressing returns a Ture"
else
    echo "No expressing returens a False"
fi

[[email protected] data]# bash test6.sh

    "No expressing returens a False"

3 bash shell 的另一种常用的测试条件

    if    [    condition        ]

    then

        commands

    fi

    方括号定义了测试条件。

    test命令可以判断三类条件:

    (1)数值比较

    (2)字符串比较

    (3)文件比较

注意:方括号之后和第二个方括号之前必须加上一个空格,否则会报错。

4    数值比较

    下表列出了测试两个值时可用的条件参数

比较

描述

n1 -eq n2

检查n1是否等于n2

n1 -ge n2

检查n1是否大于或等于n2

n1 -gt n2

检查n1是否大于n2

n1 -le n2

检查是否小于等于n2

n1 -lt n2

检查n1是否小于n2

n1 -ne n2

检查n1是否不等于n2

注意:测试命令中只能处理整数

[[email protected] data]# cat number_test.sh
#!/bin/bash
value1=10 #定义变量value1、value2
value2=11
if [ $value1 -gt 5 ]    #测试value1的值是否大于5
then
    echo "The test value $value1 is greater than 5"
fi
if [ $value1 -eq $value2 ]        #测试value1的值是否和变量value2的值相等。
then
    echo "The values are equal"
else
    echo "The values are different"
fi

[[email protected] data]# bash number_test.sh

The test value 10 is greater than 5

The values are different

5    字符串比较

    条件测试运行字符串比较,下表列出了字符串附加测试

比较

描述

str1 = str2

检查str1是否和str2 相同

str1 != str2

检查str1是否和str2不同

str1 < str2

检查str1 是否比str2小

str1 > str2

检查str1 是否比str2大

-n str1

检查str1的长度是否非0

-z str1

检查str1的长度是否为0

    要测试一个字符串是否比另一个字符串大是一个麻烦的问题,主要有一下两个问题:

(1)大于号和小于号必须转义,否则SHELL会把它们当做重定向符号,把字符串值当作文件名;

(2)大于和小于顺序和sort命令所采用的不同。

在字符串比较测试中,大写字母被认为是大于小写字母的;比较测试中使用的是标准的ASCII顺序,根据每个字符的ASCII数值来决定排序结果。

[[email protected] data]# cat str_comparison.sh
#!/bin/bash
var1=baseball
var2=hockey
if [ $var1 > $var2 ]
then
    echo "$var1 is greater than $var2"
else
    echo "$var1 is lees than $var2"
fi

[[email protected] data]# bash str_comparison.sh

baseball is lees than hockey

6    文件比较

    测试Linux上文件系统上文件和目录的状态。

比较

描述

-d file

检查file 是否存在并是一个目录

-e file

检查file是否存在

-f file

检查file是否存在并是一个文件

-r file

检查file是否存在并可读

-s file

检查file是否存在并非空

-w file

检查file是否存在并可写

-x file

检查file是否存在并可执行

-O file

检查file是否并属当前用户所有

-G file

检查file 是否存在且默认组与当前用户相同

file1 –nt file2

检查file1是否比file2新

file1 –ot file2

检查file1是否比file2旧

[[email protected]]# cattestfile_exist.sh
#!/bin/bash
item_name=$HOME
echo
echo "The item being checked:$item_name"
echo
if [ -e $item_name ]
then #item_name does exist
    echo "The item,$item_name,does exist"
    echo "But is it a file?"
    echo
if [ -f $item_name ]
then #item_name is a file
    echo "Yes,$item_name is a file"
else #item_name is not a file
    echo "No,$item_name is not a file"
fi
else #item_name does not exist
    echo "The item,$item_name, does not exist"
    echo "Nothing to update"
fi

[[email protected] data]# bash testfile_exist.sh

The item being checked:/root

The item,/root,does exist

But is it a file?

No,/root is not a file

7    复合条件测试

if-than语句中可以使用布尔逻辑来组合测试

(1) [ condition1 ] && [ condition2 ]

(2) [ conditon1 ] || [ conditon2 ]

    第一种布尔运算使用AND布尔运算符来组合两个条件。要让then部分的命令执行,两个条件必须都满足。

    第二种布尔运算使用OR布尔运算符来组合两个条件。如果任意条件为TRUEthen部分的命令就会执行。

[root@localdata]# catcompund_comparison.sh

#!/bin/bash

#

if [ -d $HOME ] && [ -w $HOME/testing ]

then

    echo "The file exists and you can write to it"

else

    echo "I can not write to the file"

fi

[[email protected] data]# bash compund_comparison.sh

I can not write to the file

    第一个比较会检查用户的$HOME目录是否存在。第二个比较会检查在用户的$HOME目录下是否有个叫做testing的文件,以及用户是否有该文件的写入权限。如果两个比较中有一个失败了,if语句就会失败,shell就会执行else的部分。如果两个条件都通过了,则if语句通过,shell会执行then部分的命令。

shell中测试命令,bashshell测试命令 bash shell中测试命令 test 命令提供了 if - than 语句中测试不同条件的途径。如果 test 命令中列出的条件...

许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令。这些命令通常被称为结构化命令。和其他高级程序设计语言一样,shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令建立非常复杂的程序。与传统的语言不同的是,shell用于指定条件值的不是布尔表达式而是命令和字符串。

    test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回退出状态吗0 。这样if-than语句就与其他编程语言中的if-than语句类似的方式工作了。如果条件不成立,test命令就会退出并返回非零的退出状态码,使得if-than语句不会被执行。

 

1    test 命令的基本格式

分支条件

    test        condition

 

        conditiontest命令要测试的一系列参数和值。

Linux 提供 $? 特殊变量来保存最后一条命令执行结束的退出状态。如果想核对一条命令的退出状态,必须在这条命令运行完成后立即查看或使用变量 $?。一条命令成功完成的退出状态是 0,如果命令执行错误,那么退出状态就会是一个正整数。

2用在if-than语句中,格式是这样的:

Linux退出状态代码

        if     test     condition

代码      描述

        then

0     命令成功完成

            commands

1     通常的未知错误

        fi

2     误用 shell 命令

    如果不写condition部分,它会以非零的退出状态码退出。then 语句块不会被执行,并执行else语句块。

126     命令无法执行

[root@local data]# cat test6.sh
#!/bin/bash
#
if    test
then
    echo "No expressing returns a Ture"
else
    echo "No expressing returens a False"
fi

127     没有找到命令

[root@local data]# bash test6.sh

128     无效的退出参数

    "No expressing returens a False"

128+x   Linux 信号 x 的致使错误

3 bash shell 的另一种常用的测试条件

255     规范外的退出状态

    if    [    condition        ]

 

    then

 

        commands

if-then语句

在其他编程语言中,if 语句后面的对象是一个值为 TRUE 或 FALSE 的等式。 bash shell脚本中的 if 语句不是这样的。 bash shell 中的 if 语句运行在 if 行定义的命令。如果命令的退出状态是0(成功执行命令),将执行 then 后面的所有命令。如果命令的退出状态是0以外的其他值,那么then后面的命令将不会执行, bash shell 会移动到脚本的下一条命令。

 

格式:

  if command

  then

       commands

  fi

 

示例

#!/bin/bash
#  testing multiple commands in the then section
testuser=rich
if grep $testuser /etc/passwd
then
  echo The bash files for user $testuser are :
  ls -a /home/$testuser/.b*
fi

注意:在一些脚本中,可能会看到 if-then 语句的另一种形式:

if command; then

  commands

fi

在计值的命令末尾使用一个分号,可以将 then 语句包含在此行中,这更像是在其他一些编程语言中处理 if-then 语句的方式。

 

    fi

if-then-else

格式:

if command

then

    commands

else

    commands

fi

示例 

#!/bin/bash
#testing multiple commands in the then section
testuser=rich
if grep $testuser /etc/passwd
then
  echo The bash files for user $testuser are:
  ls -a /home/$testuser/.b*
else
  echo "The user name $testuser doesn't exist on this system"
fi

 

    方括号定义了测试条件。

嵌套 if 语句

格式:

if command1

then

  commands

elif  command2

then

  more commands

fi

示例

#!/bin/bash

# looking for a possible value

 

if [ $USER = "rich" ]

then

  echo "Welcome $USER"

  echo "Please enjoy your visit"

elif [ $USER = barbara ]

then

  echo "Special testing account" 

else

  echo "Sorry, you're not allowed here" 

fi

 

 

    test命令可以判断三类条件:

test命令

test命令提供一种检测 if-then 语句中不同条件的方法。如果test命令中的条件评估值为true,test命令以0退出状态代码退出,如果条件为false,则test命令退出。

 

test 命令格式:

  test condition

condition 是一系列 test命令评估的参数和值。

 

在 if-then 语句中使用时,test命令如下所示:

if test condition

then

  commands

fi

 

bash shell 提供一种在 if-then 语句中声明 test 命令的另一种方法:

if [ condition ]

then

   commands

fi

方括号定义在 test 命令中使用的条件。注意,在前半个方括号的后面和后半个方括号的前面必须都有一个空格,否则会得到错误信息。

 

test 命令能够评估以下3类条件:

(1)数值比较:

  • n1 -eq n2:检查 n1 是否等于 n2
  • n1 -ge n2:检查 n1 是否大于或等于 n2
  • n1 -gt n2:检查 n1 是否大于 n2
  • n1 -le n2: 检查 n1 是否小于或等于 n2
  • n1 -lt n2: 检查 n1 是否小于 n2
  • n1 -ne n2:检查 n1 是否不等于 n2

示例

#!/bin/bash

# testing floating point numbers

val1=` echo "scale=4; 10 / 3 " | bc`

echo "The test value is $val1"

if [ $val1 -gt 3 ]

then

   echo "The result is larger than 3"

fi

注意:test 命令无法处理存储在变量 val1 中的浮点值。

(2)字符串比较:

  • str1 = str2:检查 str1 与 str2 是否相同
  • str1 != str2:检查 str1 与 str2 是否不同
  • str1 < str2:检查 str1 是否小于 str2
  • str1 > str2: 检查 str1 是否大于 str2
  • -n str1:检查 str1 的长度是否大于0
  • -z str1:检查 str1 的长度是否为0

字符串相等

示例

#!/bin/bash

# testing string equality

testuser=rich

 

if [ $USER = $testuser ]

then

   echo "Welcom $ testuser"

fi

 

字符串顺序

大于和小于符号一定要转义,否则 shell 会将它们当作重定向符号,将字符串值看作文件名。

大于和小于顺序与在 sort 命令中的顺序不同。

示例

#!/bin/bash

# mis-using string comparisons

 

var1=baseball

var2=hockkey

 

if [ $val1 > $ val2 ]

then

   echo "$val1 is greater than $var2"

else

   echo "$val1 is less than $var2"

fi

 

字符串大小

示例

#!/bin/bash

# testing string length

val1=testing

val2=''

 

if [ -n $val1 ]

then

   echo "The string '$val1' is not empty"

else

   echo "The string '$val1' is empty"

fi

 

if [ -z $val2 ]

then

   echo "The string '$val2' is not empty"

else

   echo "The string '$val2' is empty"

fi

 

if [ -z $val3 ]

then

   echo "The string '$val3' is not empty"

else

   echo "The string '$val3' is empty"

fi

空变量和没有初始化的变量长度为0。

 

(3)文件比较:

  • -d 文件名:  如果文件存在且为目录则为真
  • -e 文件名:   如果文件存在则为真
  • -f 文件名:  如果文件存在且为普通文件则为真
  • -r 文件名: 如果文件存在且可读则为真
  • -s 文件名:  如果文件存在且至少有一个字符则为真
  • -w 文件名:  如果文件存在且可写则为真
  • -x 文件名:  如果文件存在且可执行则为真
  • -o file : 检查 file 是否存在并且被当前用户拥有
  • -G file:检查 file 是否存在并且默认组是否为当前用户组
  • -c 文件名:  如果文件存在且为字符型特殊文件则为真
  • -b 文件名:  如果文件存在且为块特殊文件则为真
  • file1 -ot file2 若 file 旧于 file2,则条件成立

 

示例 

 #!/bin/bash

# check if a file

if [ -e $HOME ]

then 

   echo "The object exists, is it a file?"

   if [ -f $HOME]

   then

     echo "Yes, it's a file!"

   else

     echo "No, it's not a file!"

     if [ -f $HOME/.bash_history]

     then

       echo "But this is a file!"

     fi

  fi

else

   echo "Sorry, the object doesn't exists"

fi

    (1)数值比较

 

    (2)字符串比较

复合条件检查 

  [ condition1 ] && [ condition2 ]

两个条件必须都满足才能执行 then 部分

  [ condition1 ] || [ condition2 ] 

如果任意一个条件评估为 true,那么就会执行 then 部分

示例

#!/bin/sh 
mailfolder=/var/spool/mail/james 
[ -r "$mailfolder" ]||{ echo "Can not read $mailfolder" ; exit 1; } 
echo "$mailfolder has mail from:" 
grep "^From " $mailfolder

该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令: 

  -打印错误信息 

  -退出程序 

我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。 不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。

 

 

    (3)文件比较

if-then 高级特征

双圆括号

((  expression ))

表示数学表达数,允许在比较中包含高级数学公式。除了 test 命令使用的标准数学操作符,还包括:

 符号       描述

val++   后增量

val--    后减量

++val   前增量

--val    前减量

!     逻辑否定

~      逐位取反

**     取幂

<<      左移

>>      右移

&           

|

&&      逻辑与

||        逻辑或

 

示例

if (( $val1 ** 2 > 90 ))

then

   (( val2 = $val1 ** 2 ))

   echo "The square of $val1 is $val2"

fi

 

双方括号

[[ expression ]]

双括号命令提供了模式匹配。

示例

if [[新濠国际登录平台, $USER == r* ]]

then

  echo "Hello $USER"

else

  echo "Sorry, I don't know you"

fi

 

本文由新濠国际登录平台发布于每日资讯,转载请注明出处:命令提供了,许多程序在脚本命令之间需要某种

关键词: