关于shell:Bash变量赋值中的命令未找到错误

Command not found error in Bash variable assignment

我有一个叫做test.sh的脚本:

1
2
3
#!/bin/bash
STR ="Hello World"
echo $STR

当我运行sh test.sh时,我得到了:

1
test.sh: line 2: STR: command not found

我做错什么了?我在网上看了非常基础/初学者的bash脚本教程,这就是他们如何声明变量…所以我不知道我做错了什么。

我在Ubuntu服务器9.10上。是的,bash位于/bin/bash处。


"="符号周围不能有空格。

当你写:

1
STR ="foo"

bash试图运行一个名为str的命令,该命令有两个参数(字符串"="和"foo")。

当你写:

1
STR =foo

bash试图运行一个名为str的命令,其中有1个参数(字符串"=foo")。

当你写:

1
STR= foo

bash试图运行命令foo,str在其环境中设置为空字符串。

我不确定这是否有助于澄清,或者只是混淆,但请注意:

  • 第一个命令完全等同于:STR"=""foo"
  • 第二个与STR"=foo"相同,
  • 最后一个相当于STR="" foo
  • SH语言规范第2.9.1节的相关章节规定:

    A"simple command" is a sequence of optional variable assignments and redirections, in any sequence, optionally followed by words and redirections, terminated by a control operator.

    在这种情况下,word是bash要运行的命令。任何包含不是重定向的=的字符串(在字符串开头以外的任何位置)都是变量赋值,而任何不是重定向且不包含=的字符串都是命令。在STR ="foo"中,STR不是变量赋值。


    删除=符号周围的空格:

    1
    2
    3
    #!/bin/bash
    STR="Hello World"
    echo $STR


    在交互模式下,一切看起来都很好

    1
    2
    3
    $ str="Hello World"
    $ echo $str
    Hello World

    很明显!正如约翰内斯所说,在"="周围没有空间。如果"="周围有任何空格,则在交互模式下,它给出错误如下`

    No command 'str' found


    我知道这是一个非常高质量的答案。但是,简而言之,你不能有空间。

    1
    2
    3
    #!/bin/bash
    STR ="Hello World"
    echo $STR

    因为等号周围有空格,所以不起作用。如果你要跑…

    1
    2
    3
    #!/bin/bash
    STR="Hello World"
    echo $STR

    它会起作用


    当您定义任何变量时,就不必再放入任何额外的空格。

    例如。

    1
    2
    name ="Stack Overflow"  
    // it is not valid, you will get an error saying-"Command not found"

    所以删除空格:

    1
    name="Stack Overflow"

    它会很好地工作。


    我也有同样的问题,但似乎不是语法错误。这里有一个简单的脚本:

    1
    2
    3
    4
    5
    #!/bin/bash
    ssh -T user@server <<-EOSSH
      VAR1=test
      cd $VAR1
    EOSSH

    在我认为前两个问题可以协商的情况下,这会产生以下错误:

    1
    2
    3
    Warning: no access to tty (Bad file number).
    Thus no job control in this shell.
    VAR1=test: Command not found.