2010-02-15 97 views
364

我呼吁test.sh这个脚本:命令没有找到错误的Bash变量赋值

#!/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

+21

我很高兴你问了这个问题,你不是唯一的bash noob在那里! –

+3

感谢您提出这个问题。这不是一个尴尬的问题。我在办公室深夜工作,周围没有Bash专家来回答这个问题。 –

+1

现在(差不多七年后),有一个名为[shellcheck](http://www.shellcheck.net)的FOSS linter /分析器可以自动检测这个和其他常见的语法问题。它可以在线使用或脱机安装并集成到您的编辑器中。 –

回答

704

你不能在你的 '=' 号的空间。

当你写:

STR = "foo" 

bash会运行一个名为STR命令以2个参数(字符串 '=' 和 '富')

当你写:

STR =foo 

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

当你wr ite:

STR= foo 

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

我不知道这是否有助于澄清或者如果它是单纯的模糊,但是请注意:

  1. 的第一个命令是完全等价于:STR "=" "foo"
  2. 第二个是一样的STR "=foo",
  3. ,最后等于STR="" foo

sh language spec, section 2.9.1状态的相关部分:

A“简单的命令”是可选的变量赋值和重定向的序列,以任何顺序,任选地接着词语和重定向,通过控制终止运营商。

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

+0

如果你有一个名称含有“ - ”的变量,同样的错误发生。在这种情况下,解决方案是删除“ - ” – chomp

+0

chomp @ http://pubs.opengroup.org/onlinepubs/9699919799/的第2.10.10节的规则7b“如果前面的所有字符'='形成有效名称(请参阅XBD名称),则应返回令牌ASSIGNMENT_WORD。“在http://pubs.opengroup.org/onlinepubs/9699919799/的第3.231部分的链接之后,我们发现“在shell命令语言中,一个单词只包含便携字符集中的下划线,数字和字母。第一个名字的性格不是数字。“所以“FOO-BAR = qux”这个词不是一个变量赋值,因为“FOO-BAR”不是一个有效的名字。 –

+1

我提供一个赏金奖励这个清晰的解释给初学者一个总是常见的问题(当然,也是为了能够更快地找到它,只要我想链接它:D)。感谢您让事情变得简单! – fedorqui

130

下降的空间周围的=标志:

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

这很有趣但是,因为'set foo = bar'在Windows批处理文件中也是一个常见的错误 - 并且批处理语言被嘲笑;-) – Joey

+0

Thanks @joey。我被困在编写一个shell脚本,我在“=”之后用空格初始化变量。你保存了我的一天 –

+0

为什么bash不接受左侧字段中的数字?像3 =“Hello World”,它抱怨没有找到命令 – Freedo

5

在交互模式中一切都看起来不错

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

很明显!正如Johannes所说,'='周围没有空格。如果周围有“=”的任何空间,然后在交互模式下,它提供了错误的`

无命令“STR”发现

+1

但是请注意OP在说'STR =“Hello World”',所以这个答案在这里不适用。 – fedorqui

+0

@Arkapravo交互模式的含义是什么,它与'$'标记 –

+0

@KasunSiyambalapitiya通过“交互模式”有关,他意味着在实际终端中输入这些命令,而不是脚本。 – numbermaniac

1

当你定义任何变量,那么你就不必把在任何额外的空间。

E.g.

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

所以删除空格:

name="Stack Overflow" 

,它会正常工作。