我有一个名为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
。
答案 0 :(得分:834)
你的'='符号周围不能有空格。
当你写:
STR = "foo"
bash尝试使用2个参数运行名为STR的命令(字符串'='和'foo')
当你写:
STR =foo
bash尝试使用1个参数(字符串'= foo')
运行名为STR的命令当你写:
STR= foo
bash尝试运行命令foo,并将STR设置为其环境中的空字符串。
我不确定这是否有助于澄清或仅仅是混淆,但请注意:
STR "=" "foo"
,STR "=foo"
相同,STR="" foo
。sh language spec, section 2.9.1州的相关部分:
“简单命令”是一系列可选的变量赋值和重定向,按任意顺序,可选地后跟单词和重定向,由控制操作符终止。
在该上下文中,word
是bash将要运行的命令。任何不是重定向的包含=
(在字符串开头以外的任何位置)的字符串都是变量赋值,而任何不是重定向且不包含=
的字符串都是命令。在STR = "foo"
中,STR
不是变量赋值。
答案 1 :(得分:152)
删除=
符号周围的空格:
#!/bin/bash
STR="Hello World"
echo $STR
答案 2 :(得分:5)
在互动模式下,一切都很好看
$ str="Hello World"
$ echo $str
Hello World
显然!正如约翰内斯所说,“=”周围没有空间。如果'='周围有空格,那么在交互模式下,它会给出错误“
找不到命令'str'
答案 3 :(得分:0)
当您定义任何变量时,您不必添加任何额外的空格。
E.g。
name = "Stack Overflow"
// it is not valid, you will get an error saying- "Command not found"
所以删除空格:
name="Stack Overflow"
它会正常工作。
答案 4 :(得分:0)
我知道此问题的回答非常高质量。但是,总之,您不能有空格。
#!/bin/bash
STR = "Hello World"
echo $STR
由于等号周围的空格而无法工作。如果你要跑步...
#!/bin/bash
STR="Hello World"
echo $STR
那行得通
答案 5 :(得分:-1)
我有完全相同的问题,但似乎不是语法错误。这里是一个简单的脚本:
#!/bin/bash
ssh -T user@server <<-EOSSH
VAR1=test
cd $VAR1
EOSSH
这会输出以下错误,我认为前两个是可以协商的:
Warning: no access to tty (Bad file number).
Thus no job control in this shell.
VAR1=test: Command not found.