在从文件

时间:2017-12-19 17:22:22

标签: linux bash shell

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

示例1(script1.sh):

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

示例2(script2.sh):

cat script2.sh

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

示例input.txt

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

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

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

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

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

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

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