Bash“;如果;无论发生什么情况,都要执行的条件

Bash“;如果;无论发生什么情况,都要执行的条件,bash,if-statement,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 我希望这只打印 “苹果二进制属性列表” 如果语句成功,则仅打印“否”,

我不熟悉bash脚本,虽然我知道这无疑是一个重复的问题,但我不知道如何用词来搜索它

for i in $( ls); do
    FILETYPE=$( file -b $i )
    if [ "$FILETYPE"="Apple binary property list" ]; then
        echo $FILETYPE
    else 
        echo "nope"
    fi
done
我希望这只打印
“苹果二进制属性列表”
如果语句成功,则仅打印“否”,否则

所发生的事情是,无论语句是否成功,它都在打印文件类型,并且从不打印“否”

我知道这很简单,但有人能告诉我为什么它会打印除“苹果二进制属性列表”和“否”之外的任何内容吗,

我能做些什么来修复它呢?

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

写的时候(没有空格)

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

添加空格时,如

"$FILETYPE" = "Apple binary property list"

该命令有三个参数,将正确地将其解析为字符串、操作和另一个字符串。

问题在于方括号
[
是一个命令,它是该命令的别名,并且作为所有命令,它希望其参数用空格分隔

写的时候(没有空格)

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

添加空格时,如

"$FILETYPE" = "Apple binary property list"
该命令有三个参数,将正确地将其解析为字符串、操作和另一个字符串。

不要使用此参数:

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"
不要使用此选项:

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"

请尝试在条件中的字符串之间添加一些空格,例如,
“$FILETYPE”=“…”
使用shellcheck.net查找脚本中的明显错误我的问题是为什么它会在if中做什么,如果该语句不正确…如果它只打印“nope”,我会理解但这对我来说毫无意义,如果条件失败,它为什么会回显$filetype。Nubhava,你是冠军。这太棒了。Joachim,你是对的,如果你加上它作为答案,我会给你一个复选标记:-)试着在条件中的字符串之间添加一些空格,比如
“$filetype”=“…”
使用shellcheck.net查找脚本中的明显错误我的问题是,如果该语句不正确,它为什么要执行if中的操作…如果它只打印“no”,我会理解但这对我来说毫无意义,如果条件失败,它为什么会回显$filetype。Nubhava,你是冠军。这太棒了。Joachim,你是对的,如果你加上它作为答案,我会给你一个复选标记:-)“[是一个命令,它包含一个参数列表,用空格分隔”=头脑发热”[是一个接受参数列表的命令,用空格分隔“=头脑发热