有人可以帮忙吗:
我想通过从另一个文本文件中读取它们来在 shell 脚本中执行一些命令,如下所示:
command_file.txt 包含:
EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)
shell脚本.sh
#!/bin/sh
while read command
do
echo $command
done < command_file.txt
我的问题是,echo 按命令文件中的文本打印。 我怎样才能让它展开并打印实际日期和主机名。
例如 预期输出应该是:
EXECUTED_OK_22-02-2010 11:10:10
EXECUTED_OK_localhost
但是我得到:
EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)
最佳答案
这种白名单方法不允许执行任意代码,如 eval
做。如果安全不是问题,您应该坚持使用 eval
,因为此示例中使用的外部有许多极端情况,对于这些情况,替换将无法按预期工作。
程序在打印命令之前用它们的输出替换命令文件的每个命令中引用的某些外部对象:
#!/bin/bash
while read command
do
while read -a external ; do
output=$( "${external[@]}" )
command=$( sed "s/\$(${external})/${output}/g" <<< "$command" )
done <<END
date -R
hostname
END
echo "$command"
done < command_file.txt
要使用更多外部组件,您需要将它们添加到 <<END
之间的 heredoc 中和 END
.我添加了 -R
至 date
展示带有参数的外部。
正如已经指出的那样,除了分词之外,不会对外部命令进行任何处理(例如引号、替换)(空格可以转义(one\ two
)而不是引号)。
关于linux - Word 未扩展为 bash 中的 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56244924/