linux - 打印包含命令的变量

标签 linux bash variables echo

有人能告诉我如何打印变量而不是在 bash 中执行它吗?我的意思是:

bash@bash $ cat script.sh 
#!/bin/bash
echo $1

bash@bash $ ./script.sh "`date`"
Sat Sep 20 18:42:19 CEST 2014

我不想得到:

Sat Sep 20 18:35:37 CEST 2014

我想得到输出:

date

我对如何防止执行发送给脚本的命令很感兴趣。

最佳答案

看起来您正试图阻止代码被注入(inject)到您的脚本中。 echo $1 的问题是 $1 的内容正在被 shell 评估。为了避免这种情况,您需要在脚本中用双引号将 $1 括起来:

#!/bin/bash
echo "$1"

测试:

$ ./script.sh '`date`'
`date`

您问题中的问题是您在 "date" 周围使用了双引号,因此在您的脚本运行之前已经发生了扩展。您可以使用 set -x 来查看区别:

$ set -x
$ ./script '`date`'
+ ./script '`date`' 
`date`
$ ./script "`date`"
++ date                                   # date is being run
+ ./script 'Sat Sep 20 18:01:32 BST 2014' # result is passed to your script
Sat Sep 20 18:01:32 BST 2014

对此您无能为力。

我认为我的原始答案的以下部分仍然相关,所以我将其保留。

bash 中不同类型的引号

反引号(您在问题中使用过)是一种捕获执行命令输出的老式方法。更现代的语法是 $( ),因此如果您想将当前日期存储在变量中,您可以执行 d=$(date)。单引号用于文字字符串,因此 echo '$d' 将输出 $d,而不是变量的值。双引号内的变量被展开,因此 echo "$d" 将输出变量 $d 的值。将变量用双引号括起来以防止 word splitting 总是一个好主意。和 glob expansion .

关于linux - 打印包含命令的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25948859/

相关文章:

linux - 无法访问 Docker 容器中已安装的主机目录

linux - 在分别打印文件名和行时查找文件中的最大行?

Windows Batch - 检查一个命令变量是否出现在另一个命令变量中

linux - 显示当前解释器有多少个子进程的命令

用于递归查找字符串的正则表达式?

mysql - 使用 bash 选择 mysql 查询

php - PHP包含文件中的 undefined variable 错误

c - 如何让它显示第二大值而不是最小值

c - Ubuntu 10 中的实验性缓冲区溢出(汇编)

linux - 运行自定义 bash 函数时防止终端关闭