0

我正在尝试在 shell 中创建一个搜索程序作为练习,但是当我尝试使用 if 语句处理空行时,我收到一条消息,指出 shell 遇到了意外的运算符。

    #!/bin/sh

file=$1
token=$2

while read line
do
    if [ ! -z $line ]
    then
      set $line
      if [ $1 = $token ] 
      then 
        echo $line
      fi
    fi
done < $file

match_token animals_blanks dog当我使用我运行程序时

./match_token: 8: [: cat: unexpected operator
./match_token: 8: [: dog: unexpected operator
./match_token: 8: [: dog: unexpected operator
./match_token: 8: [: cow: unexpected operator
./match_token: 8: [: lion: unexpected operator
./match_token: 8: [: bear: unexpected operator
./match_token: 8: [: wolf: unexpected operator

Animals_blanks 文件包含:

cat meow kitten

dog ruff pup
dog bark

cow moo calf

lion roar cub

bear roar cub
wolf howl pup
4

1 回答 1

2

引用变量:

 if [ ! -z "$line" ]

但通常,人们会写:

 if [ -n "$line" ]

当您将变量不加引号时,该[命令会看到类似的内容:[ -n cat dog ],这是一个错误,因为它只需要 . 之后的一个参数-n。通过引用变量,表达式变成[ -n "cat dog" ]只有一个参数,正如预期的那样[。请注意,实际上没有理由进行该测试或使用set; read 可以在读取时为您拆分行:

while read animal sound offspring; do
    test "$animal" = "$token" && echo $animal $sound $offspring
done < $file
于 2013-01-25T00:35:15.207 回答