在Bash变量赋值时报错"command not found"

2023-09-25 11:03:16 浏览数 (2)

问:

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

代码语言:javascript复制
#!/bin/bash
STR = "Hello World"
echo $STR

当我运行 bash test.sh 时,我会得到以下信息:

代码语言:javascript复制
test.sh: line 2: STR: command not found

我做错了什么?我在网上看过一些非常基础/初学者的 bash 脚本教程,这是他们如何声明变量的……所以我不确定我做错了什么。

我使用的是Ubuntu服务器 9.10。是的,bash 位于 /bin/bash。

答:

= 号周围不能有空格。

当你写成:

代码语言:javascript复制
STR = "foo"

bash 尝试运行带有两个参数(字符串 = 和 foo)的命令 STR。这一行完全等同于 STR "=" "foo",由于系统中没有名为 STR 的命令,于是报错提示“STR: command not found”。

当你写成:

代码语言:javascript复制
STR =foo

bash 尝试运行一个名为 STR 的命令,带有一个参数(字符串 =foo)。这一行等同于 STR "=foo",运行脚本会得到同样的提示。

当你写成:

代码语言:javascript复制
STR= foo

bash 试图在其环境中将 STR 设置为空字符串的情况下运行命令 foo。这一行等同于 STR="" foo,由于系统中没有名为 foo 的命令,于是报错提示“foo: command not found”。

按 Bash Reference Manual 中的描述:

当一个简单的命令被执行时,shell 会按照以下顺序从左到右执行以下扩展、赋值和重定向操作: 1. 解析器标记为变量赋值(命令名称之前的那些)和重定向的单词将被保存以供随后的处理。 2. 不是变量赋值或重定向的单词将被扩展。如果扩展后还有任何单词,第一个单词被用作命令名,其余的单词是参数。 3. 在每个变量赋值中,'=' 后面的文本在赋值给变量之前会经历波浪号扩展、参数扩展、命令替换、算术扩展和引号删除。

可知在 STR = "foo" 中,STR 不是变量赋值。


参考:

  • stackoverflow question 2268104
  • https://www.gnu.org/software/bash/manual/bash.html#Simple-Command-Expansion

相关阅读:

  • 如何通过一个Bash定界符来分割一个字符串
  • Bash中单引号和双引号的区别
  • 为什么Bash中的"["和"]"周围应该有空格

0 人点赞