UNIX多条件条件

时间:2014-11-08 04:49:54

标签: bash shell 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每次我运行它。 无论我使用错误的算子或括号还是方括号,我都不确定我的情况有什么问题。

1 个答案:

答案 0 :(得分:2)

在一个半教育的猜测中,你想写的是:

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

  

我们应该使用方括号?

从历史上看,测试命令/bin/test已链接到/bin/[,并且是外部命令,而不是内置的shell。这些天(现在几十年),它已经内置了一个shell。但是,它遵循命令的结构,需要空格来分隔参数,如果它被调用为[,那么最后一个参数必须是]

关于何时使用它,在需要测试条件时使用它。

请注意,您可以写:

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" ]