打印包含命令的变量

时间:2014-09-20 12:40:51

标签: 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

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

2 个答案:

答案 0 :(得分:3)

看起来您正在尝试阻止将代码注入到脚本中。 echo $1的问题是shell正在评估$1的内容。为了避免这种情况,您需要在脚本中将$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 splittingglob expansion

答案 1 :(得分:0)

用单引号替换 var1 的反引号:

var1='date'
var2="echo $var1"
echo $var2