0

演習としてシェルで検索プログラムを作成しようとしていますが、ifステートメントを使用して空の行を処理しようとすると、シェルで予期しない演算子が検出されたというメッセージが表示されます。

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

animal_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 ]が表示されます。これは、の後に1つの引数しか期待できないため、エラーになります-n。変数を引用することにより、式は[ -n "cat dog" ]、で予想されるように、引数が1つしかない式になり[ます。setそのテストを実行したり、 ;を使用したりする理由は実際にはないことに注意してください。readは、次のように読み取るときに行を分割できます。

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