如果条件,shell脚本出错

时间:2013-10-07 17:22:25

标签: bash shell unix

我不明白他在这里的错误是我对shell脚本的新手。请帮帮我

./bpr: line 8: syntax error near unexpected token `then'
./bpr: line 8: `    if[$(grep -o BPR $file | wc -l) == 1]; then '

5 个答案:

答案 0 :(得分:3)

您需要在[ ]之间添加空格,试试这个:

if [ $(grep -o BPR $file | wc -l) == 1 ]; then

答案 1 :(得分:3)

你的病情需要一个空间:

if [ $(grep -o BPR $file | wc -l) == 1 ]; then
    ^                                 ^

1)如果您使用的是bash,则可以使用内置的[[ ..]]代替test[ ...])命令。

2)您也可以使用grep的wc选项来避免-c

if [[ $(grep -c -o BPR $file) == 1 ]]; then

答案 2 :(得分:1)

除了语法错误之外,如果您不关心文件中可能存在多个wc的出现,则不需要BPR

if grep -o BPR "$file"; then

答案 3 :(得分:1)

有几件事:

  • 您需要[]周围的空格。
  • 您可能不想使用[]

if语句运行您提供的命令。如果该命令返回零,则执行then语句的if部分。如果该命令返回非零值,则执行else部分(如果存在)。

试试这个:

$ if ls some.file.name.that.does.not.exist
> then
>     echo "Hey, the file exists!"
> else
>     echo "Nope. File isn't there"
> fi

你会得到一个输出:

ls: some.file.name.that.does.not.exist: No such file or directory
Nope. File isn't there

第一个语句当然是ls命令的输出。第二个是if语句的输出。 ls已运行,但无法访问该文件(它不存在)并返回e 1。这导致else子句执行。

试试这个:

$ touch foo
$ if ls foo
>     echo "Hey, the file exists!"
> else
>     echo "Nope. File isn't there"
> fi

你会得到一个输出:

foo
Hey, the file exists!

第一行再次是ls的输出。由于该文件存在且状态稳定,因此ls返回了0。这导致if子句执行,打印第二行。

如果我想测试文件是否存在怎么办?

您可以使用test命令:

$ if test -e foo
> then
>     echo "Hey, the file exists!"
> else
>     echo "Nope. File isn't there"
> fi

如果文件foo存在,则test命令返回0.这意味着echo "Hey, the file exists!"将执行。如果文件不存在,test将返回1,else子句将执行。

现在这样做:

$ ls -il /bin/test /bin/[
10958 -rwxr-xr-x  2 root  wheel  18576 May 28 22:27 /bin/[
10958 -rwxr-xr-x  2 root  wheel  18576 May 28 22:27 /bin/test

第一个数字是inode。如果两个匹配的文件具有相同的inode,则它们彼此硬链接。 [ ... ]只是test命令的另一个名称。 [是一个实际的命令。这就是为什么你需要它周围的空间。您还看到if测试命令是否成功,并且实际上没有进行布尔检查(例外情况是,如果您使用双方括号,如[[]]而不是{ {1}}和[。这些内置在shell中,而不是内置命令。)

您可能想要做的是:

]

if grep -q "BPR" "$file" then echo "'BPR' is in '$file'" fi 标志告诉-q关闭它的yap。如果您提供的模式在文件中,grep命令将返回grep,并且非零(精确值无关紧要 - 只要它不是0)它不能。

注意我不需要0 ... [因为我使用grep命令的输出来查看是否应该执行该语句的if子句。

答案 4 :(得分:0)

如果你只需要知道字符串是否匹配而没有显示实际的匹配使用

if grep -q 'anystring' file ; then