我试图在shell中创build一个search程序作为练习,但是当我尝试用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
引用变量:
if [ ! -z "$line" ]
但通常情况下,会写:
if [ -n "$line" ]
当你不加引号的时候, [
command]看起来像: [ -n cat dog ]
,这是一个错误,因为在-n
后面只有一个参数。 通过引用该变量,表达式变成[ -n "cat dog" ]
,它只有一个参数,正如[
所期望的[
。 请注意,确实没有理由做这个测试,或者使用set
; 当它读取时,读取可以为您分割行:
while read animal sound offspring; do test "$animal" = "$token" && echo $animal $sound $offspring done < $file