Bash变量分配中找不到命令错误


519

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


49
很高兴您确实提出了这个问题,您不是那里唯一的bash菜鸟!
米勒大猩猩

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

3
这些天(将近七年后!),有一台名为shellcheck的FOSS linter /分析器将自动检测此问题和其他常见语法问题。它可以在线使用或离线安装并集成到您的编辑器中。
那个人


我建议您使用:除非您完全确定自己是因为这个答案,否则#!/usr/bin/env bash不要直接放置它:stackoverflow.com/a/21613044/3589567#!/bin/bashbash/bin
Alejandro Blasco

Answers:


927

您的'='符号周围不能有空格。

当你写:

STR = "foo"

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

当你写:

STR =foo

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

当你写:

STR= foo

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

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

  1. 所述第一命令是完全等效于:STR "=" "foo"
  2. 第二个是作为相同STR "=foo"
  3. 最后一个等价于STR="" foo

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

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

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


2
如果您的变量名包含“-”,则会发生相同的错误。在这种情况下,解决方案是删除“-”
chomp

1
chomp @在pubs.opengroup.org/onlinepubs/9699919799第2.10.10节的规则7b中,“如果'='之前的所有字符均形成有效名称(请参见XBD名称),则应返回令牌ASSIGNMENT_WORD。在pubs.opengroup.org/onlinepubs/9699919799的 3.231节的链接之后,我们找到了“在shell命令语言中,一个仅由可移植字符集中的下划线,数字和字母组成的单词。名称的第一个字符为不是数字。”。因此,该单词FOO-BAR=qux不是变量赋值,因为FOO-BAR它不是有效名称。
William Pursell

2
我提供了赏金,以奖励对初学者来说总是很常见的问题做出清晰的解释(很好,而且当我想将其链接到:D时,也能够更快地找到它)。感谢您使事情变得如此简单!
fedorqui'SO停止伤害

1
@fedorqui谢谢!我并不完全相信这是一个明确的解释,而且我经常想知道是否可以简化它。
威廉·珀塞尔

159

删除=标志周围的空格:

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

9
不过,这很有趣,这也是set foo = barWindows批处理文件中的一个常见错误-在那里,批处理语言被嘲笑了;-)
Joey 2010年

谢谢@joey。我被困在编写shell脚本的过程中,在脚本中用“ =”后面的空格初始化变量。您保存了我的一天
Lalit Rao 2015年

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

6

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

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

显然,(!)的约翰尼斯说,没有周围空间=。如果周围有空间,=则在交互模式下会给出错误

找不到命令“ str”


2
但是请注意OP在说STR = "Hello World",因此此答案不适用于此处。
fedorqui'SO停止伤害

@Arkapravo交互模式的含义是什么,与$标记有关吗
Kasun Siyambalapitiya

@KasunSiyambalapitiya通过“交互模式”表示要在实际终端中键入这些命令,而不是在脚本中键入。
numbermaniac

5

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

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

由于等号周围存在空格而无法工作。如果你要跑步...

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

会的


2

定义任何变量时,您不必放置任何额外的空格。

例如

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

因此,删除空格:

name="Stack Overflow" 

它将正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.