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

问题描述 投票:456回答:6

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

bash shell syntax sh variable-assignment
6个回答
852
投票

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

当你写:

STR = "foo"

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

当你写:

STR =foo

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

当你写:

STR= foo

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

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

  1. 第一个命令完全等同于:STR "=" "foo"
  2. 第二个与STR "=foo"相同,
  3. 而最后一个相当于STR="" foo

sh language spec, section 2.9.1的相关部分指出:

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

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


152
投票

放下=标志周围的空格:

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

5
投票

在交互模式下一切都很好

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

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

找不到命令'str'


0
投票

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

EG

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

删除空格:

name="Stack Overflow" 

它会工作正常。


0
投票

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

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

因为等号周围的空格而无法工作。如果你要跑......

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

它会工作

© www.soinside.com 2019 - 2024. All rights reserved.