学习调试:
cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; echo $i - $param; done
1 - test1,test2,test3
哎呀..
scriptParams="test1 test2 test3"
cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; echo $i - $param; done
1 - test1
2 - test2
3 - test3
好吧,看起来更好...
cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; sed -e "s/\${$i}/$param/" ; done
param1=test1
param2=${2}
param3=${3}
哎呀……那有什么问题吗?好吧,第一个sed
命令“吃掉”所有输入。您还没有建立一个管道,其中一个sed
命令提供下一个命令......您有三个sed
s 试图读取相同的输入。显然,第一个处理了整个输入。
好的,让我们采用不同的方法,让我们为单个sed
命令创建参数(注意:""
那里强制echo
不解释-e
为命令行开关)。
sedargs=$(for param in ${scriptParams} ; do i=$((++i)); echo "" -e "s/\${$i}/$param/"; done)
cat template.txt | sed $sedargs
param1=test1
param2=test2
param3=test3
而已。请注意,这并不完美,如果替换文本很复杂(例如:包含空格),您可能会遇到各种问题。
让我想想如何以更好的方式做到这一点......(嗯,想到的明显解决方案是不使用 shell 脚本来完成这项任务......)
更新:如果你想建立一个合适的管道,这里有一些解决方案:How to make a pipe loop in bash