为什么在没有变量的情况下直接使用它时条件不起作用?

Scr*_*tty 5 bash command-substitution test variable

这给了我一个错误,说参数太多:

if [ $( file -b $i ) == "directory" ]
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时

name=$( file -b $i )
if [ name == "directory" ]
Run Code Online (Sandbox Code Playgroud)

它似乎工作得很好。

有人可以解释这一点或在文档中指出解释吗?

hee*_*ayl 7

几个问题:

  • ]表示[( test)的参数结束,并且必须是最后一个参数;你有几个]s,这是错误的;大概你打算使用:

    if [ $( file -b $i ) == "directory" ]
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您使用了上述内容,您将得到bash: [: too many arguments,因为将在变量扩展 ( $i)的输出上进行分词,然后进行命令替换,$()( filecommand) 并且[会在 之前看到多个单词=,从而导致错误消息。您需要引用变量扩展和命令替换:

    [ "$(file -b "$1")" == "directory" ]
    
    Run Code Online (Sandbox Code Playgroud)

作为旁注,您应该使用bash关键字[[,而不是[因为前者会为您处理分词(和路径名扩展)。