我正在尝试读取配置文件,然后将配置的“部分”放入bash脚本中的数组中,然后运行该命令,然后再次通过配置重新执行,并继续执行这直到配置文件结束。
以下是配置文件示例:
PORT="5000" USER="nobody" PATH="1" OPTIONS="" PORT="5001" USER="nobody" PATH="1" OPTIONS="" PORT="5002" USER="nobody" PATH="1" OPTIONS=""
我希望bash脚本在第一个“部分”中读取,将其带入脚本,然后运行以下命令:
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS
但是,我希望它根据配置文件中有多少“部分”来进行“部分”的每次迭代,并运行带有相应配置设置的命令并将其应用于最终命令。因此,如果要从上面读取配置文件,输出将是:
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS
反过来看起来像这样:
scriptname -p 5000 -u nobody -P 1 -o "" scriptname -p 5001 -u nobody -P 1 -o "" scriptname -p 5002 -u nobody -P 1 -o ""
提前致谢。
答案 0 :(得分:3)
#!/bin/bash
if [[ $# -ne 1 ]]; then
echo "Usage: $0 script.cfg" >&2
exit 1
fi
function runscript() {
scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS
}
while read LINE; do
if [[ -n $LINE ]]; then
declare "$LINE"
else
runscript
fi
done < "$1"
runscript
如果要同时在后台运行脚本,请尝试以下操作:
function runscript() {
nohup scriptname -p $PORT -u $USER -P $PATH -o $OPTIONS &> /dev/null &
}
最后的&
使它们在后台运行,而nohup
确保它们在shell退出时不会被杀死。最终效果是将脚本转换为守护进程,这样无论父脚本发生了什么,它们都会在后台连续运行。
答案 1 :(得分:2)
#!/bin/bash
awk 'BEGIN{ FS="\n";RS=""}
{
for(i=1;i<=NF;i++){
gsub(/.[^=]*=|\042/,"",$i)
}
print "scriptname -p "$1" -u "$2" -P "$3" -o "$4
}' file | bash
答案 2 :(得分:0)
假设各部分之间只有一条空行:
cat <yourfile> | while read ; do
if [ -z "$REPLY" ] ; then
scriptname -p $PORT -u $USER -P $PATH -o "$OPTIONS"
else
eval "$REPLY" # NOTE: eval is evil
fi
done