我有这个名为 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
。
#!/usr/bin/env bash
而不是直接放入 #!/bin/bash
,除非您绝对确定您的 bash
在 /bin
中,因为这个答案:stackoverflow.com/a/21613044/3589567
=
符号周围不能有空格。
当你写:
STR = "foo"
bash 尝试使用 2 个参数(字符串 =
和 foo
)运行名为 STR
的命令
当你写:
STR =foo
bash 尝试使用 1 个参数(字符串 =foo
)运行名为 STR
的命令
当你写:
STR= foo
bash 尝试在其环境中将 STR 设置为空字符串来运行命令 foo
。
我不确定这是否有助于澄清或仅仅是混淆,但请注意:
第一个命令完全等同于:STR "=""foo",第二个等同于 STR"=foo",最后一个等同于 STR="" foo。
sh language spec, section 2.9.1 的相关部分指出:
“简单命令”是一系列可选的变量分配和重定向,以任何顺序,可选地后跟单词和重定向,由控制运算符终止。
在这种情况下,word
是 bash 将要运行的命令。任何包含 =
的字符串(在字符串开头以外的任何位置)不是重定向并且其中 =
之前的字符串部分是有效的变量名是变量赋值,而任何字符串那不是重定向或变量赋值是命令。在 STR = "foo"
中,STR
不是变量赋值。
删除 =
符号周围的空格:
#!/bin/bash
STR="Hello World"
echo $STR
set foo = bar
在 Windows 批处理文件中也是一个常见错误——批处理语言因此而受到嘲笑;-)
在交互模式下,一切看起来都很好:
$ str="Hello World"
$ echo $str
Hello World
显然(!)正如 Johannes 所说,=
周围没有空格。如果 =
周围有任何空格,则在交互模式下它会给出错误
找不到命令“str”
STR = "Hello World"
,因此此答案不适用于此处。
$
标记有关
我知道这已经得到了一个非常高质量的答案。但是,简而言之,你不能有空格。
#!/bin/bash
STR = "Hello World"
echo $STR
由于等号周围有空格,因此无法正常工作。如果你要跑...
#!/bin/bash
STR="Hello World"
echo $STR
它会工作
当您定义任何变量时,您不必添加任何额外的空格。
例如
name = "Stack Overflow"
// it is not valid, you will get an error saying- "Command not found"
所以删除空格:
name="Stack Overflow"
它会正常工作。
FOO-BAR=qux
不是变量赋值,因为FOO-BAR
不是有效名称。$st=$i
不是变量赋值。它扩展为一个字符串,并且该字符串作为命令执行。您似乎正在尝试执行eval $st=$i
。不要那样做。