如何在bash中输出包含未转义美元符号的变量

19

如果我有一个包含未转义美元符号的变量,有没有办法将整个变量的内容输出?

例如,有些东西调用了脚本:

./script.sh "test1$test2"

然后如果我想使用参数,它会被“截断”如下:

echo ${1}
test1

当然,用单引号括起来的变量名并没有帮助。我无法弄清楚如何对其进行引用,以便在脚本接收参数后至少可以自己转义美元符号。

4个回答

31
问题在于脚本首先接收到的是“test1”,而它不可能知道引用了一个空(未声明)的变量。在将其传递给脚本之前,你必须对$进行转义,像这样:
./script.sh "test1\$test2"

或者像这样使用单引号'

./script.sh 'test1$test2'

在这种情况下,Bash不会从该参数字符串中展开变量。

8
变量在脚本运行之前就被替换了。
./script.sh 'test1$test2'

是的,这似乎是事实 :) - Not22
然而,有时我会遇到变量中包含未转义的美元符号的情况,比如当我从文件中读取数据时。接下来,我想使用这些数据调用我的脚本,那么在读取文件之前,我唯一的选择是对整个文件进行sed操作吗? - Not22
2
从文件中读取数据不会进行变量替换。 - Ignacio Vazquez-Abrams

4

使用单引号时,像$这样的元字符将保留其字面值。如果使用双引号,则变量名将被插值。


0

正如Ignacio告诉你的那样,变量被替换了,所以你的脚本得到了./script.sh test1作为$0$1的值。

但即使在你使用文字引号传递参数的情况下,你也应该始终在echo "${1}"中引用"$1"。这是一个好习惯。


大括号 是必需的,因为这是一个简单的替换。 - Ignacio Vazquez-Abrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接