Bash变量赋值中未找到命令错误

Jak*_*son 493 syntax bash shell sh variable-assignment

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

#!/bin/bash
STR = "Hello World"
echo $STR
Run Code Online (Sandbox Code Playgroud)

我跑的时候sh test.sh得到这个:

test.sh: line 2: STR: command not found
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我在网上看一下非常基础/初学者的bash脚本教程,这就是他们说声明变量的方式......所以我不确定我做错了什么.

我在Ubuntu Server 9.10上.是的,bash位于/bin/bash.

Wil*_*ell 883

'='符号周围不能有空格.

当你写:

STR = "foo"
Run Code Online (Sandbox Code Playgroud)

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

当你写:

STR =foo
Run Code Online (Sandbox Code Playgroud)

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

当你写:

STR= foo
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 所述第一命令是完全等效于:STR "=" "foo",
  2. 第二个是一样的STR "=foo",
  3. 而最后一个相当于STR="" foo.

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

"简单命令"是一系列可选的变量赋值和重定向,以任何顺序,可选地后跟字和重定向,由控制操作符终止.

在该上下文中,a word是bash将要运行的命令.包含=(在字符串开头以外的任何位置)不是重定向的任何字符串都是变量赋值,而不是重定向且不包含的任何字符串=都是命令.In STR = "foo",STR不是变量赋值.

  • 如果您的变量名包含“-”,则会发生相同的错误。在这种情况下,解决方案是删除“-” (2认同)
  • 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`不是一个有效的名字。 (2认同)
  • 我提供了赏金,以奖励对初学者来说总是很常见的问题做出清晰的解释(很好,而且当我想将其链接到:D时,也能够更快地找到它)。感谢您使事情变得如此简单! (2认同)
  • @Timo `$st=$i` 不是变量赋值。它扩展为一个字符串,并且该字符串作为命令执行。看来您正在尝试执行“eval $st=$i”。不要那样做。 (2认同)

Joe*_*oey 154

放下=标志周围的空格:

#!/bin/bash 
STR="Hello World" 
echo $STR 
Run Code Online (Sandbox Code Playgroud)

  • 但这很有趣,因为`set foo = bar`也是Windows批处理文件中常见的错误 - 并且批处理语言因此受到嘲笑;-) (8认同)

小智 7

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

#!/bin/bash
STR = "Hello World"
echo $STR
Run Code Online (Sandbox Code Playgroud)

由于等号周围的空格而不起作用。如果你要跑...

#!/bin/bash
STR="Hello World"
echo $STR
Run Code Online (Sandbox Code Playgroud)

它会工作


Ark*_*avo 5

在交互模式下一切都很好

$ str="Hello World"
$ echo $str
Hello World
Run Code Online (Sandbox Code Playgroud)

显然!正如约翰内斯所说,"="周围没有空间.如果'='周围有空格,那么在交互模式下它会给出错误

找不到命令'str'

  • 但是请注意OP说'STR ="Hello World",所以这个答案不适用于此. (2认同)

Rav*_*nki 5

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

例如

name = "Stack Overflow"  
// it is not valid, you will get an error saying- "Command not found"
Run Code Online (Sandbox Code Playgroud)

因此删除空格:

name="Stack Overflow" 
Run Code Online (Sandbox Code Playgroud)

它会工作得很好。