我有一个名为test.sh的脚本:

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

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

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

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

我用的是Ubuntu Server 9.10。是的,bash位于/bin/bash


当前回答

我知道这个问题已经得到了高质量的回答。但是,简而言之,你不能有空格。

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

因为等号周围有空格。如果你要逃跑…

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

这是可行的

其他回答

我知道这个问题已经得到了高质量的回答。但是,简而言之,你不能有空格。

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

因为等号周围有空格。如果你要逃跑…

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

这是可行的

去掉=号周围的空格:

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

当你定义任何变量时,你不需要插入任何额外的空格。

E.g.

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

所以去掉空格:

name="Stack Overflow" 

它会工作得很好。

=号周围不能有空格。

当你写:

STR = "foo"

bash尝试运行带有两个参数的名为STR的命令(字符串=和foo)

当你写:

STR =foo

bash尝试运行一个名为STR的命令,带有一个参数(string =foo)

当你写:

STR= foo

bash尝试运行命令foo, STR设置为其环境中的空字符串。

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

第一个命令完全等价于:STR "=" "foo", 第二个与STR "=foo"相同, 最后一个就相当于STR="" foo。

sh语言规范的相关部分,第2.9.1节说明:

“简单命令”是可选变量赋值和重定向的序列,以任意顺序,后面可选地跟着单词和重定向,以控制操作符结束。

在该上下文中,单词是bash将要运行的命令。任何包含=(在字符串开头以外的任何位置)的字符串,如果不是重定向,并且在=之前的字符串部分是有效变量名,则是变量赋值,而任何不是重定向或变量赋值的字符串都是命令。在STR = "foo"中,STR不是变量赋值。

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

$ str="Hello World"
$ echo $str
Hello World

显然(!)正如Johannes所说,没有空格=。如果在=周围有空格,那么在交互模式下,它会给出错误

没有找到命令'str'