Linux命令:test

今天同事问了我一个问题,有关于Linux命令:test的用法。其实是比较简单的,下面先看看那个问题:

#!/bin/bash
flag=0;
for ((i=1;i<7;i++))
do
        echo -n "please input your name:";
        read username;
        echo -n "please input your password:";
        read password;
        echo -n "your name is "
        echo $username
        echo -n "your password is ";
        echo $password;
        if test "$username" = "user" -a "$password" = "pwd"
        then
                echo "login success"
                flag=1;
                break;
        fi
        echo "your name or password wrong! Try it again.";
done

if test "$flag" -eq "0"
then
        echo "you have tried 6 times.login fail!"
fi

这个小程序主要是登陆一个用户,判断用户名和密码是否匹配,匹配的话就login success,否则Try is again。知道直到六次完了后就login fail!

test用法在网上找了一下,基本上就的下面的一些!

 

     每一种条件语句的基础都是判断什么是真什么是假。是否了解其测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号file1 -nt file2 测试以判断第一个文件是否比第二个文件更新(由修改日期决定)
file1 -ot file2 测试以判断第一个文件是否比第二个文件更旧

以下示例显示了使用这些运算符比较文件的结果:

$ [ evan -nt spencer ]
$ echo $?
0
$ [ karen -ot spencer ]
$ echo $?
1
$

名为 evan 的文件比名为 spencer 的文件更新,因而评估为真。类似地,名为 karen 的文件比名为 spencer 的文件更新,因此该评估为假。

 

字符串比较运算符

如标题所示,这组函数比较字符串的值。您可以检查它们是否存在、是否相同或者是否不同。

String 测试以判断字符串是否不为空
-n string 测试以判断字符串是否不为空;字符串必须为 test 所识别
-z string 测试以判断字符串是否为空;字符串必须为 test 所识别
string1 = string2 测试以判断 string1 是否与 string2 相同
string1 != string2 测试以判断 string1 是否与 string2 不同

对任何变量进行的最有用的测试之一是判断它的值是否不为空,可以简单地将其放在 test 命令行中执行这种测试,如下例所示:

$ test "$variable"

强烈建议进行此种测试时用双引号将变量括住,以让 shell 识别变量(即使变量为空)。默认情况下执行的基本字符串评估和 -n 测试从功能上讲是相同的,如以下示例所示:

#example1
if test -n "$1"
then
echo "$1"
fi

执行以上例子中的代码将根据 $1 是否存在给出以下结果:

$ example1 friday
friday
$
$ example1
$

如果将代码更改为以下形式,则结果将相同:

#example2
if test "$1"
then
echo "$1"
fi

如下所示:

$ example2 friday
friday
$
$ example2
$

所有这些表明,通常不需要 -n,它代表默认操作。

要从一个不同的角度来查看各种可能性,您可以用另一个选项来替换 -n,并检查该值是否为空(相对于非空)。这可以用 -z 选项来实现,代码为:

#example3
if test -z "$1"
then
echo "no values were specified"
fi

运行如下:

$ example3
no values were specified
$ example3 friday
$

如果在没有命令行参数的情况下运行该程序,而表达式评估为真,那么将执行程序块中的文本。如果在命令行中有值,则脚本退出,不执行任何操作。将评估操作放在脚本的开头非常有用,这可以在可能产生错误的进一步处理之前预先检查变量值。

其余的字符串运算符对两个变量/字符串之间的精确匹配或其中的差异(您也可以称之为等价性和“不等价性”)进行评估。第一个例子对匹配进行测试:

$ env
LOGNAME=emmett
PAGER=less
SHELL=/bin/bash
TERM=linux
$
$ [ "$LOGNAME" = "emmett" ]
$ echo $?
0
$
$ [ "$LOGNAME" = "kristin" ]
$ echo $?
1
$

或者,该评估可以以脚本的形式用于决定是否运行脚本:

#example4
if [ "$LOGNAME" = "emmett" ]
then
echo "processing beginning"
else
echo "incorrect user"
fi

这种方法可以用来寻找任意的值(如终端类型或 shell 类型),在允许脚本运行之前这些值必须匹配。请注意,= 或 != 运算符的优先级高于其它大多数可指定选项,且要求必须伴有表达式。因此,除了比较字符串的选项之外,= 或 != 都不能和检查某种东西(如可读文件、可执行文件或目录)的存在性的选项一起使用。

 

整数比较运算符

正如字符串比较运算符验证字符串相等或不同一样,整数比较运算符对数字执行相同的功能。如果变量的值匹配则表达式测试为真,如果不匹配,则为假。整数比较运算符不处理字符串(正如字符串运算符不处理数字一样):

int1 -eq int2 如果 int1 等于 int2,则为真
int1 -ge int2 如果 int1 大于或等于 int2,则为真
int1 -gt int2 如果 int1 大于 int2,则为真
int1 -le int2 如果 int1 小于或等于 int2,则为真
int1 -lt int2 如果 int1 小于 int2,则为真
int1 -ne int2 如果 int1 不等于 int2,则为真

以下示例显示了一个代码段,其中在命令行中给出的值必须等于 7:

#example5
if [ $1 -eq 7 ]
then
echo "You've entered the magic number."
else
echo "You've entered the wrong number."
fi

运行中:

$ example5 6
You've entered the wrong number.
$
$ example5 7
You've entered the magic number.
$

和字符串一样,比较的值可以是在脚本外为变量赋的值,而不必总是在命令行中提供。以下示例演示了实现这一点的一种方法:

#example6
if [ $1 -gt $number ]
then
echo "Sorry, but $1 is too high."
else
echo "$1 will work."
fi

$ set number=7
$ export number
$ example6 8
Sorry, but 8 is too high.
$ example6 7
7 will work.
$

整数比较运算符最佳的用途之一是评估指定的命令行变量的数目,并判断它是否符合所要求的标准。例如,如果某个特定的命令只能在有三个或更少变量的情况下运行,

#example7 - display variables, up to three
if [ "$#" -gt 3 ]
then
echo "You have given too many variables."
exit $#
fi

只要指定三个或更少的变量,该示例脚本将正常运行(并返回值 0)。如果指定了三个以上的变量,则将显示错误消息,且例程将退出 — 同时返回与命令行中给定的变量数相等的退出代码。

对这个过程进行修改可以用来在允许运行报表之前判断当天是否是本月的最后几天:

#example8 - to see if it is near the end of the month#
set `date` # use backward quotes
if [ "$3" -ge 21 ]
then
echo "It is close enough to the end of the month to proceed"
else
echo "This report cannot be run until after the 21st of the month"
exit $3
fi

在这个例子中,设置了六个变量(通过空格彼此分开):

$1 = Fri
$2 = Feb
$3 = 6
$4 = 08:56:30
$5 = EST
$6 = 2004

这些值可以在脚本中使用,就像它们是在命令行中输入的一样。请注意,退出命令再次返回一个值 — 在这种情况下,返回的值是从 $3 的值中得到的日期。这一技巧在故障诊断时会非常有用 — 如果您认为脚本应该运行而没有运行,那么请查看 $? 的值。

一种类似的想法可能是撰写一个只在每个月的第三个星期三运行的脚本。第三个星期三一定在该月的 15 日到 21 日之间。使用 cron,您可以调用脚本在 15 日到 21 日之间每天的一个指定时间运行,然后使用脚本的第一行检查 $1(在设置日期之后)的值是否为 Thu。如果为 Thu,那么执行剩下的脚本,如果不是,则退出。

而另一个想法可能是,只允许脚本在超过 6:00 p.m. (18:00),所有用户都回家之后运行。只要撰写脚本,使其在值低于 18 时退出,并通过使用以下命令来获取时间(将其设为 $1)

set `date +%H`

 

布尔运算符

布尔运算符在几乎每种语言中的工作方式都相同 — 包括 shell 脚本。在 nutshell 中,它们检查多个条件为真或为假,或者针对假的条件而不是真的条件采取操作。与 test 搭配使用的运算符有

! expr 如果表达式评估为假,则为真
expr1 -a expr2 如果 expr1 和 expr2 评估为真,则为真
expr1 -o expr2 如果 expr1 或 expr2 评估为真,则为真

可以用 != 运算符代替 = 进行字符串评估。这是最简单的布尔运算符之一,对 test 的正常结果取非。

其余两个运算符中的第一个是 -a(即 AND)运算符。要使测试最终为真,两个表达式都必须评估为真。如果任何一个评估为假,则整个测试将评估为假。例如,

$ env
HOME=/
LOGNAME=emmett
MAIL=/usr/mail/emmett
PATH=:/bin:/usr/bin:/usr/lbin
TERM=linux
TZ=EST5:0EDT
$
$ [ "$LOGNAME" = "emmett" -a "$TERM" = "linux" ]
$ echo $?
0
$

$ [ "LOGNAME" = "karen" -a "$TERM" = "linux" ]
$ echo $?
1
$

在第一个评估中,两个条件都测试为真(在一个 linux 终端上登录的是 emmett),因此整个评估为真。在第二个评估中,终端检查正确但用户不正确,因此整个评估为假。

简而言之,AND 运算符可以确保代码只在两个条件都满足时才执行。相反,只要任何一个表达式测试为真,OR (-o) 运算符即为真。我们来修改先前的例子,并将其放到一个脚本中来说明这一点:

#example9
if [ "$LOGNAME" = "emmett" -o "$TERM" = "linux" ]
then
echo "Ready to begin."
else
echo "Incorrect user and terminal."
fi

$ env
HOME=/
LOGNAME=emmett
MAIL=/usr/mail/emmett
PATH=:/bin:/usr/bin:/usr/lbin
TERM=linux
TZ=EST5:0EDT
$ example9
Ready to begin.
$
$ LOGNAME=karen
$ example9
Ready to begin.
$

在脚本第一次运行时,评估判断用户是否等于 emmett。如果发现用户等于 emmett,则脚本转至 echo 语句,并跳过其余的检查。它从不检查终端是否等于 linux,因为它只需要找到一条为真的语句就可以使整个运算为真。在脚本第二次运行时,它判断用户不是 emmett,因此它将检查并发现终端确实是 linux。由于一个条件为真,脚本现在转至 echo 命令。为了引出第二条消息,两个条件都必须为假。

在先前确定时间是否为月末的例子中,可以执行类似的检查来防止用户试图在周末运行脚本:

#example10 - Do not let the scrīpt run over the weekend#
set `date` # use backward quotes
if [ "$1" = "Sat" -o "$1" = "Sun" ]
then
echo "This report cannot be run over the weekend."

fi

 

出处:http://www.oracle.com/technology/global/cn/pub/articles/dulaney_test.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值