Bash变量赋值中未找到命令错误
我有一个名为test.sh的脚本:Bash变量赋值中未找到命令错误,bash,shell,syntax,sh,variable-assignment,Bash,Shell,Syntax,Sh,Variable Assignment,我有一个名为test.sh的脚本: #!/bin/bash STR = "Hello World" echo $STR 当我运行sh test.sh时,我得到以下结果: test.sh: line 2: STR: command not found 我做错了什么?我在网上看了一些非常基础/初学者的bash脚本教程,这就是他们如何声明变量。。。所以我不确定我做错了什么 我在Ubuntu服务器9.10上。是的,bash位于/bin/bash删除=标志周围的空格: #!/bin/bash STR
#!/bin/bash
STR = "Hello World"
echo $STR
当我运行sh test.sh
时,我得到以下结果:
test.sh: line 2: STR: command not found
我做错了什么?我在网上看了一些非常基础/初学者的bash脚本教程,这就是他们如何声明变量。。。所以我不确定我做错了什么
我在Ubuntu服务器9.10上。是的,bash位于
/bin/bash
删除=
标志周围的空格:
#!/bin/bash
STR="Hello World"
echo $STR
=
符号周围不能有空格
当你写作时:
STR = "foo"
STR =foo
STR= foo
bash尝试运行名为STR
的命令,该命令有两个参数(字符串=
和foo
)
当你写作时:
STR = "foo"
STR =foo
STR= foo
bash尝试运行名为STR
的命令,该命令有一个参数(字符串=foo
)
当你写作时:
STR = "foo"
STR =foo
STR= foo
bash尝试在其环境中将STR设置为空字符串的情况下运行命令foo
我不确定这是否有助于澄清,或者仅仅是混淆,但请注意:
STR“=”foo“
STR“=foo”
相同STR=”“foo
在这种情况下,bash将要运行的命令是
word
。任何包含=
(位于字符串开头以外的任何位置)且不是重定向且=
前面的字符串部分是有效变量名的字符串都是变量分配,而任何不是重定向或变量分配的字符串都是命令。在STR=“foo”
中,STR
不是变量赋值。在交互模式下,一切看起来都很好:
$ str="Hello World"
$ echo $str
Hello World
显然(!)正如约翰所说,=
周围没有空格。如果=
周围有空格,则在交互模式下,它会给出如下错误:
找不到命令“str”
当您定义任何变量时,您不必再添加任何额外的空格 例如 因此,请删除空格:
name="Stack Overflow"
它会很好地工作。我知道这个问题已经得到了高质量的回答。但是,简而言之,你不能有空间
#!/bin/bash
STR = "Hello World"
echo $STR
因为等号周围有空格,所以不起作用。如果你要跑
#!/bin/bash
STR="Hello World"
echo $STR
它可以工作这很有趣,因为在Windows批处理文件中,
set foo=bar
也是一个常见错误,批处理语言因此受到嘲笑;-)谢谢你,乔伊。我被困在编写一个shell脚本中,在脚本中初始化变量时,在“=”之后加上空格。你救了我一天为什么bash不接受左边字段中的数字?就像3=“Hello World”,它抱怨命令没有找到我很高兴你问了这个问题,你不是唯一的巴什努伯!谢谢你问这个问题。这不是一个令人尴尬的问题。我在办公室工作到很晚&我身边没有Bash专家来回答这个问题。现在(差不多七年后!)有一个名为FOSS linter/分析器的软件,可以自动检测这个问题和其他常见的语法问题。它可以在线使用,也可以离线安装并集成到编辑器中。另请参阅我建议您使用的:#/usr/bin/env bash
而不是直接放入#/bin/bash
除非您完全确定您的bash
位于/bin
中,因为这个答案:如果您有一个名称包含“-”的变量,则会发生相同的错误。在这种情况下,解决方案是删除第2.10.10节规则7b中的“-”chomp@“如果“=”前面的所有字符构成有效名称(请参见XBD名称),则应返回令牌分配字。”在链接到的第3.231节之后,我们发现在shell命令语言中,仅由可移植字符集中的下划线、数字和字母组成的单词。名称的第一个字符不是数字。”。因此,单词FOO-BAR=qux
不是一个变量赋值,因为FOO-BAR
不是一个有效的名称。我悬赏奖励,以奖励这一对初学者常见问题的清晰解释(好吧,并且无论何时我想链接它都能更快地找到它:D)。谢谢你让事情变得这么简单!@fedorqui谢谢!我不完全相信这是一个清楚的解释,我经常想知道它是否可以变得更简单。@Timo$st=$I
不是一个变量赋值。它扩展为一个字符串,该字符串作为一个命令执行。似乎你正在尝试执行eval$st=$I
。不要这样做。但是请注意OP说的是STR=“Hello World”
,所以这个答案在这里不适用。@Arkapravo交互模式的含义是什么,它与$
mark@KasunSiyambalapitiya“交互模式”指的是在实际终端中输入这些命令,而不是在脚本中。