有人能告诉我如何打印变量而不是在 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/