我的代码有一些问题。这是我的代码:
#!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
。我不确定我的条件出了什么问题,是用错了运算符、括号还是方括号。
根据半教育程度的猜测,你想写的是:
if [ "$#" -eq 1 ] && grep -q "$1" test.txt; then
我们应该在哪些场合使用方括号?
从历史上看,测试命令/bin/test
链接到/bin/[
,是一个外部命令,而不是内置的shell。如今(几十年来),它已经是一个内置的外壳。但是,它遵循命令的结构,需要空格来分隔参数,如果它被调用为[
,那么最后一个参数必须是]
。
至于你什么时候使用它,你在需要测试一个条件的时候使用它。
注意,你可以写:
if ls; false; true; then echo "the last command counts"; else echo "no it doesn't"; fi
if
命令执行一个或多个命令的序列,并测试最后一个命令的退出状态。如果退出状态为0表示成功,则执行then
子句;如果退出状态不为0,则使用else
子句。
因此,您可以在需要测试某些内容时使用该测试。它可以是if
或elif
或while
(或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" ]