在从文件读取的输入中执行命令替换

问题描述 投票:0回答:2

在shell脚本中如何在输入文件字符串中创建脚本读取命令

Example 1 (script1.sh):

a="google.analytics.account.id=`read a`"
echo $a

Example 2 (script2.sh):

cat script2.sh

a=`head -1 input.txt`
echo $a

Sample input.txt

google.analytics.account.id=`read a`

如果我运行script1.shread命令工作正常,但是当我运行script2.sh时,read命令不会执行,而是作为输出的一部分打印。

所以我希望script2.sh具有与script1.sh相同的输出。

linux bash shell
2个回答
1
投票

您的input.txt内容在此处作为脚本有效执行;只有完全信任这些内容才能在您的计算机上运行任意命令时才执行此操作。那说:

#!/usr/bin/env bash
#              ^^^^- not /bin/sh; needed for $'' and $(<...) syntax.

# generate a random sigil that's unlikely to exist inside your script.txt
# maybe even sigil="EOF-$(uuidgen)" if you're guaranteed to have it.
sigil="EOF-025CAF93-9479-4EDE-97D9-483A3D5472F3"

# generate a shell script which includes your input file as a heredoc
script="cat <<$sigil"$'\n'"$(<input.txt)"$'\n'"$sigil"

# run that script
eval "$script"

0
投票

在script1.sh中,第一行被计算,因此read a被执行并替换为字符串。

在脚本2.sh中,第一行被计算,因此执行head的结果字符串被放入变量a中。

没有对结果字符串进行重新评估。如果使用eval $a添加评估,并且input.txt中的第一行与script1.sh的第一行完全相同(实际上缺少a="..."),那么您可能会得到相同的结果。正如CharlesDuffy所说,heredoc似乎更准确。

© www.soinside.com 2019 - 2024. All rights reserved.