问:
我有一个名为 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中的"["和"]"周围应该有空格