Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash变量赋值中未找到命令错误_Bash_Shell_Syntax_Sh_Variable Assignment - Fatal编程技术网

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

Bash变量赋值中未找到命令错误,bash,shell,syntax,sh,variable-assignment,Bash,Shell,Syntax,Sh,Variable Assignment,我有一个名为test.sh的脚本: #!/bin/bash STR = "Hello World" echo $STR 当我运行sh test.sh时,我得到以下结果: test.sh: line 2: STR: command not found 我做错了什么?我在网上看了一些非常基础/初学者的bash脚本教程,这就是他们如何声明变量。。。所以我不确定我做错了什么 我在Ubuntu服务器9.10上。是的,bash位于/bin/bash删除=标志周围的空格: #!/bin/bash STR

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

#!/bin/bash
STR = "Hello World"
echo $STR
当我运行
sh test.sh
时,我得到以下结果:

test.sh: line 2: STR: command not found
我做错了什么?我在网上看了一些非常基础/初学者的bash脚本教程,这就是他们如何声明变量。。。所以我不确定我做错了什么


我在Ubuntu服务器9.10上。是的,bash位于
/bin/bash

删除
=
标志周围的空格:

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

=
符号周围不能有空格

当你写作时:

STR = "foo"
STR =foo
STR= foo
bash尝试运行名为
STR
的命令,该命令有两个参数(字符串
=
foo

当你写作时:

STR = "foo"
STR =foo
STR= foo
bash尝试运行名为
STR
的命令,该命令有一个参数(字符串
=foo

当你写作时:

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

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

  • 第一个命令完全等效于:
    STR“=”foo“
  • 第二个与
    STR“=foo”
    相同
  • 最后一个相当于
    STR=”“foo
  • 缔约国的有关部分:

    “简单命令”是一系列可选的变量赋值和重定向,可以是任意顺序,后面可以是单词和重定向,由控制运算符终止


    在这种情况下,bash将要运行的命令是
    word
    。任何包含
    =
    (位于字符串开头以外的任何位置)且不是重定向且
    =
    前面的字符串部分是有效变量名的字符串都是变量分配,而任何不是重定向或变量分配的字符串都是命令。在
    STR=“foo”
    中,
    STR
    不是变量赋值。

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

    $ str="Hello World"
    $ echo $str
    Hello World
    
    显然(!)正如约翰所说,
    =
    周围没有空格。如果
    =
    周围有空格,则在交互模式下,它会给出如下错误:

    找不到命令“str”


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

    例如

    因此,请删除空格:

    name="Stack Overflow" 
    

    它会很好地工作。

    我知道这个问题已经得到了高质量的回答。但是,简而言之,你不能有空间

    #!/bin/bash
    STR = "Hello World"
    echo $STR
    
    因为等号周围有空格,所以不起作用。如果你要跑

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

    它可以工作

    这很有趣,因为在Windows批处理文件中,
    set foo=bar
    也是一个常见错误,批处理语言因此受到嘲笑;-)谢谢你,乔伊。我被困在编写一个shell脚本中,在脚本中初始化变量时,在“=”之后加上空格。你救了我一天为什么bash不接受左边字段中的数字?就像3=“Hello World”,它抱怨命令没有找到我很高兴你问了这个问题,你不是唯一的巴什努伯!谢谢你问这个问题。这不是一个令人尴尬的问题。我在办公室工作到很晚&我身边没有Bash专家来回答这个问题。现在(差不多七年后!)有一个名为FOSS linter/分析器的软件,可以自动检测这个问题和其他常见的语法问题。它可以在线使用,也可以离线安装并集成到编辑器中。另请参阅我建议您使用的:
    #/usr/bin/env bash
    而不是直接放入
    #/bin/bash
    除非您完全确定您的
    bash
    位于
    /bin
    中,因为这个答案:如果您有一个名称包含“-”的变量,则会发生相同的错误。在这种情况下,解决方案是删除第2.10.10节规则7b中的“-”chomp@“如果“=”前面的所有字符构成有效名称(请参见XBD名称),则应返回令牌分配字。”在链接到的第3.231节之后,我们发现在shell命令语言中,仅由可移植字符集中的下划线、数字和字母组成的单词。名称的第一个字符不是数字。”。因此,单词
    FOO-BAR=qux
    不是一个变量赋值,因为
    FOO-BAR
    不是一个有效的名称。我悬赏奖励,以奖励这一对初学者常见问题的清晰解释(好吧,并且无论何时我想链接它都能更快地找到它:D)。谢谢你让事情变得这么简单!@fedorqui谢谢!我不完全相信这是一个清楚的解释,我经常想知道它是否可以变得更简单。@Timo
    $st=$I
    不是一个变量赋值。它扩展为一个字符串,该字符串作为一个命令执行。似乎你正在尝试执行
    eval$st=$I
    。不要这样做。但是请注意OP说的是
    STR=“Hello World”
    ,所以这个答案在这里不适用。@Arkapravo交互模式的含义是什么,它与
    $
    mark@KasunSiyambalapitiya“交互模式”指的是在实际终端中输入这些命令,而不是在脚本中。