gpt4 book ai didi

linux - 打印包含命令的变量

转载 作者:太空宇宙 更新时间:2023-11-04 08:58:37 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com