【发布时间】:2014-05-01 15:06:28
【问题描述】:
我有一个 bash 脚本,它将文件的内容通过管道传输到一系列用户定义的函数中,每个函数在标准输入上执行 sed 操作,将输出发送到标准输出。
例如:
#!/bin/bash
MOD_config ()
{
sed 's/config/XYZ/g'
}
MOD_ABC ()
{
sed 's/ABC/WHOA!/g'
}
cat demo.txt \
| MOD_config \
| MOD_ABC
到目前为止一切顺利。一切都很好。
现在我想允许通过脚本的命令行指定额外的模式更改对。例如,我想允许用户运行任何这些:
demo.sh # changes per script (MOD_config and MOD_ABC)
demo.sh CDE 345 # change all 'CDE' to '345'
demo.sh CDE 345 AAAAA abababa # .. also changes 'AAAAA' to 'abababa'
所以我尝试将其添加到脚本中:
USER_MODS ()
{
if [ $# -lt 1]; then
#just echo stdin to stdout if no cmd line args exist
grep .
else
STARTING_ARGC=$#
I=1
while [ $I -lt $STARTING_ARGC ]; then
sed "s/$1/$2/g"
shift
shift
I=`expr $I + 2`
done
fi
}
cat demo.txt \
| MOD_config \
| MOD_ABC \
| USER_MODS
这种方法只有在我没有命令行参数或者只有两个时才有效。但是,在命令行中添加额外的 args 没有任何效果。
不确定如何将 while 循环的一次迭代的标准输出发送到下一次迭代的标准输入。我认为这是我的问题的症结所在。
有解决办法吗?还是我应该采取完全不同的方法?
【问题讨论】:
标签: bash sed pipe user-defined-functions