Bash“if”条件无论如何都被执行

时间:2016-07-29 07:30:27

标签: bash if-statement

我是bash脚本的新手,虽然我知道这无疑是一个重复的问题,但我无法弄清楚如何用它来搜索它。

for i in $( ls); do
    FILETYPE=$( file -b $i )
    if [ "$FILETYPE"="Apple binary property list" ]; then
        echo $FILETYPE
    else 
        echo "nope"
    fi
done

我希望这只能打印 “Apple二元财产清单”
当声明成功时,否则只打印“nope”。

正在发生的是,无论语句是成功还是失败,它都会打印文件类型,并且永远不会打印“nope”。

我知道这很简单,但是有人可以告诉我为什么除了“Apple二元房产列表”和“nope”之外还打印其他内容, 以及我能做些什么来解决它?

2 个答案:

答案 0 :(得分:2)

不要使用它:

for i in $( ls); do

因为当文件名包含*之类的空格或字符时它会中断。使用此:

for i in *; do

*扩展到目录中所有文件的列表。

出于相关原因,不要忘记引用shell变量:

FILETYPE=$( file -b "$i" )

这会将整个变量作为单个参数传递,这就是你想要的。

[是一个命令,它接受一个由空格分隔的参数列表:

if [ "$FILETYPE" = "Apple binary property list" ]; then

如果没有空格,[只会看到两个参数,"$FILETYPE"="Apple binary property list"]

再次,在变量周围使用引号:

    echo "$FILETYPE"

答案 1 :(得分:0)

问题是方括号[是一个命令,它是test命令的别名,并且所有命令都希望它的参数用空格分隔。

当你写(没有任何间距)

"$FILETYPE"="Apple binary property list"

这是test命令的单个参数,它使用单个参数作为非空字符串,它始终为true。

添加空格时,例如

"$FILETYPE" = "Apple binary property list"

test命令有三个参数,并将正确解析为字符串,操作和另一个字符串。