2014-11-08 67 views
-1

我的代码在这里有一些问题。这是我的代码:UNIX多个如果条件

#!bin/sh 
grep "$1" Rail.txt > test.txt 
if [ "$#" -eq 1 -a grep -q "$1" test.txt ]; then 
    grep "$1" Rail.txt 
else 
    echo not found 
fi 

问题:

它说:script.sh: line 3: [: too many arguments我每次运行它。 我不知道我的病情有什么问题,无论我使用错误的操作符还是使用括号或方括号。

+0

该文件有多大? – 2014-11-08 04:52:42

回答

2

在一个半猜测,你想要写的是:

if [ "$#" -eq 1 ] && grep -q "$1" test.txt; then 

在什么ocassions我们应该用方括号?

在历史上,测试命令,/bin/test是有联系的/bin/[,并且是外部命令,而不是外壳内置。现在(几十年来),它一直是内置的外壳。但是,它遵循命令的结构,需要空格来分隔参数,如果它被调用为[,那么最后一个参数必须是]

至于当你使用它时,你需要测试一个条件时使用它。

请注意,你可以写:

if ls; false; true; then echo "the last command counts"; else echo "no it doesn't"; fi 

if命令执行一个或多个命令序列,并测试最后一个命令的退出状态。如果退出状态为0,则成功执行then子句;如果退出状态不为0,则采用else子句。

因此,您可以在需要测试某些东西时使用该测试。它可以是ifelifwhile(或until)的一部分。它也可以对自己使用||&&

[ -z "$1" ] && echo "No arguments - or the first argument is an empty string" 

[ "$var1" -gt "$var2" ] || echo "Oops!" && exit 1 

这些可以写成if陈述过,当然:

if [ -z "$1" ] 
then echo "No arguments - or the first argument is an empty string" 
fi 

if [ "$var1" -le "$var2" ] 
then 
    echo "Oops!" 
    exit 1 
fi 

注意,我需要反转测试在第二改写。 Bash有一个内置的!运营商用于反转下面的命令的退出状态,所以我还可以这样写:

if ! [ "$var1" -gt "$var2" ] 

test!太多,所以它也可以写成:

if [ ! "$var1" -gt "$var2" ] 
+0

太过于字面上'多年的经验'。 – 2014-11-08 05:25:41

+0

我们应该使用方括号吗? – 2014-11-08 07:01:39