Shell if statements not working as intended

て烟熏妆下的殇ゞ 提交于 2019-12-25 05:23:34

问题


I am attempting to create a search program in shell as an exercise, but when I try to handle empty lines with an if-statement I get a message saying that the shell encountered an unexpected operator.

    #!/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

When I run the program using match_token animals_blanks dog I get

./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

The animals_blanks files contains:

cat meow kitten

dog ruff pup
dog bark

cow moo calf

lion roar cub

bear roar cub
wolf howl pup

回答1:


Quote the variable:

 if [ ! -z "$line" ]

but normally, one would write:

 if [ -n "$line" ]

When you leave the variable unquoted, the [ command sees something like: [ -n cat dog ], which is an error because it expects only one argument after -n. By quoting the variable, the expression becomes [ -n "cat dog" ] which has only one argument, as expected by [. Note that there's really no reason to do that test, or to use set; read can split the line for you when it reads:

while read animal sound offspring; do
    test "$animal" = "$token" && echo $animal $sound $offspring
done < $file


来源:https://stackoverflow.com/questions/14513397/shell-if-statements-not-working-as-intended

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!