有人可以告诉我如何打印变量而不是在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
我对如何防止执行已发送的命令到脚本感兴趣。
答案 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
你无能为力。
我认为我原来答案的以下部分仍然具有相关性,因此我将其保留。
反引号(您在问题中使用过)是一种捕获执行命令输出的老式方法。更现代的语法是$( )
,因此如果您想将当前日期存储在变量中,您可以d=$(date)
。单引号用于文字字符串,因此echo '$d'
将输出$d
,而不是变量的值。双引号内的变量被展开,因此echo "$d"
将输出变量$d
的值。最好将变量用双引号括起来以防止word splitting和glob expansion。
答案 1 :(得分:0)
用单引号替换 var1 的反引号:
var1='date'
var2="echo $var1"
echo $var2