我想用bash脚本编辑一堆文件。首先,我需要文件的单一路径以及计数器。到目前为止,我想出了这个:
let n=0
array=(`pwd`"/worker/worker*/conf/logfilefilter-worker*.xml")
for i in "${array[@]}"; do
let "c += 1"
echo $i
echo $c
# here comes the edit stuff.
done
但是这个循环只运行一次:
[mles@sagnix etl-i_test]$ ./iprog_new --test
/home/devel/mles/etl-i_test/worker/worker01/conf/logfilefilter-worker01.xml /home/devel/mles/etl-i_test/worker/worker02/conf/logfilefilter-worker02.xml /home/devel/mles/etl-i_test/worker/worker03/conf/logfilefilter-worker03.xml /home/devel/mles/etl-i_test/worker/worker04/conf/logfilefilter-worker04.xml /home/devel/mles/etl-i_test/worker/worker05/conf/logfilefilter-worker05.xml /home/devel/mles/etl-i_test/worker/worker06/conf/logfilefilter-worker06.xml /home/devel/mles/etl-i_test/worker/worker07/conf/logfilefilter-worker07.xml /home/devel/mles/etl-i_test/worker/worker08/conf/logfilefilter-worker08.xml
1
循环如何通过文件一个接一个地运行?
答案 0 :(得分:5)
此
array=(`pwd`"/worker/worker*/conf/logfilefilter-worker*.xml")
只是一个元素,因为文件名通配(对于*
)在引用的字符串中被抑制。然后在"${array[@]}"
中,单个元素得到了全局扩展,但由于双引号保留为单个字符串,所有文件名以空格分隔。确实
array=(`pwd`/worker/worker*/conf/logfilefilter-worker*.xml)
或
for i in ${array[@]}; do # no double quotes
工作得更好?另一方面,如果没有像数组这样的bashims更便携的解决方案呢?迭代文件的规范方法是
for file in $PWD/worker/worker*/conf/logfilefilter-worker*.xml; do
echo "$file"
done