在shell脚本中如何在输入文件字符串中创建脚本读取命令
a="google.analytics.account.id=`read a`"
echo $a
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相同的输出。
您的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"
在script1.sh中,第一行被计算,因此read a
被执行并替换为字符串。
在脚本2.sh中,第一行被计算,因此执行head
的结果字符串被放入变量a中。
没有对结果字符串进行重新评估。如果使用eval $a
添加评估,并且input.txt中的第一行与script1.sh的第一行完全相同(实际上缺少a="..."
),那么您可能会得到相同的结果。正如CharlesDuffy所说,heredoc似乎更准确。