641

我有这个名为 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.

4

5 回答 5

1119

=标志周围不能有空格。

当你写:

STR = "foo"

bash 尝试运行一个以STR2 个参数(字符串=foo)命名的命令

当你写:

STR =foo

bash 尝试运行以STR1 个参数(字符串=foo)命名的命令

当你写:

STR= foo

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

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

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

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

“简单命令”是一系列可选的变量分配和重定向,以任何顺序,可选地后跟单词和重定向,由控制运算符终止。

在这种情况下, aword是 bash 将要运行的命令。任何包含=(在字符串开头以外的任何位置)的字符串不是重定向,并且其中字符串之前的部分=是有效的变量名是变量赋值,而任何不是重定向的字符串或变量赋值是一个命令。在STR = "foo",STR不是变量赋值。

于 2010-02-15T18:34:40.900 回答
182

=删除标志周围的空格:

#!/bin/bash 
STR="Hello World" 
echo $STR 
于 2010-02-15T18:34:40.643 回答
8

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

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

显然(!)正如约翰内斯所说,周围没有空间==如果在交互模式下周围有任何空间,则会出现错误

找不到命令“str”

于 2010-02-26T06:33:51.300 回答
7

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

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

由于等号周围有空格,因此无法正常工作。如果你要跑...

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

它会工作

于 2019-03-27T12:58:52.643 回答
4

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

例如

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

所以删除空格:

name="Stack Overflow" 

它会正常工作。

于 2017-06-19T15:16:22.880 回答