shell Bash脚本-在命令输出中填充变量引用[duplicate]

0lvr5msh  于 2022-12-13  发布在  Shell
关注(0)|答案(4)|浏览(119)

此问题在此处已有答案

How to expand shell variables in a text file?(共10个答案)
昨天关门了。
这是我所遇到的问题的简化版本,只是为了演示的目的。但是当命令输出包含变量引用时,它似乎没有经过评估过程来填充它所包含的变量引用。
因此,请演示我创建了一个txt文件(/mnt/external.txt),其中包含以下文本行“${var 1}/filename.txt”。然后,我将执行如下所示的bash脚本:

#!/bin/bash
var1="/home/user1"
echo $(cat /mnt/external.txt)

然后输出“${var 1}/文件名.txt”,而不是“/home/user1/filename.txt”。
有没有办法让它重新计算cat命令的输出(刚才用cat演示了这个问题),让它用变量值填充变量引用?

lbsnaicq

lbsnaicq1#

您可以为命令的所有输出调用envsubst,这是您在注解中提到的内容,而不是您的问题。

#! /bin/bash

export MYVAR=myval

for i in {0..3}
do
    echo "$i: \$MYVAR"
done | envsubst

并且输出被

0: myval
1: myval
2: myval
3: myval
olmpazwi

olmpazwi2#

您需要通过eval传递返回的字符串,以使替换生效。您的代码片段应修改如下:

#!/bin/bash
var1="/home/user1"
eval echo $(cat /mnt/external.txt)
apeeds0o

apeeds0o3#

这打印你想要的,但我同意戈登,这是不安全的。

#!/usr/bin/env bash

export var1="/home/user1"
echo "$(eval "echo $(< /mnt/external.txt)")"
llycmphe

llycmphe4#

您可以使用heredoc来展开变量和命令替换:

eval "
cat <<EOF
$(</mnt/external.txt)
EOF"

这里eval只用于打印文件external.txt,因此heredoc可以展开它。
这比eval "echo '$(<external.txt)'"更安全、更可预测(即使使用引号),但如果external.txt包含像$(rm important.txt)这样的命令sub或heredoc分隔符,仍然会出现代码注入:

EOF
rm important.txt

不同之处在于,它比eval + echo的可预测性稍强,因为在eval + echo中,偏离的引号和/或列表运算符(;|&等)可能导致代码执行。

相关问题