2016-07-29 24 views
0

我是新来的bash脚本编制,虽然我知道这无疑是一个重复的问题,但我无法弄清楚如何将它搜索出来。Bash“if”条件被执行,不管是什么

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

我期待这时候的语句成功,并仅打印“不”,否则只打印
“苹果二进制属性列表”

发生什么事情是它打印文件类型,不管语句是成功还是失败,并且从不打印“nope”。

我知道这是简单的,但有人可以告诉我为什么它打印除“Apple二进制属性列表”和“不”之外的任何东西,
和我能做些什么来解决它?

+3

尝试添加字符串之间的一些空间的条件,如' “$ FILETYPE”= “...”' –

+3

使用shellcheck.net到找到你的脚本明显的失误 – anubhava

+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" 
+0

“[是需要的参数列表,用空格分隔命令” =头脑吹 –

0

问题是,方括号[是一个命令,它是test命令的别名,以及它期望其参数的所有命令都由空格分隔。

当你写(没有任何间距)

"$FILETYPE"="Apple binary property list" 

这是一个参数的test命令,它使用单一参数作为一个非空字符串,它永远是正确的。

当你添加空格,像

"$FILETYPE" = "Apple binary property list" 

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