如何迭代Bash脚本中的位置参数?

时间:2009-11-20 08:50:48

标签: bash scripting

我哪里错了?

我有一些文件如下:

filename_tau.txt
filename_xhpl.txt
fiename_fft.txt
filename_PMB_MPI.txt
filename_mpi_tile_io.txt

我将tauxhplfftmpi_tile_ioPMB_MPI作为位置参数传递给脚本,如下所示:

./script.sh tau xhpl mpi_tile_io fft PMB_MPI

我希望grep在循环内搜索,首先搜索tau,xhpl等等。

point=$1     #initially points to first parameter
i="0"
while [$i -le 4]
do
  grep "$str" ${filename}${point}.txt
  i=$[$i+1]
  point=$i     #increment count to point to next positional parameter
done

5 个答案:

答案 0 :(得分:6)

像这样设置你的for循环。使用这种语法,循环遍历位置参数,依次将每个参数分配给“点”。

for point; do
  grep "$str" ${filename}${point}.txt 
done

答案 1 :(得分:4)

有多种方法可以做到这一点,虽然我会使用shift,但这是另一种方法。它使用Bash的间接功能:

#!/bin/bash
for ((i=1; i<=$#; i++))
do
    grep "$str" ${filename}${!i}.txt
done

此方法的一个优点是您可以在任何地方启动和停止循环。假设您已经验证了范围,您可以执行以下操作:

for ((i=2; i<=$# - 1; i++))

另外,如果你想要最后一个参数:${!#}

答案 2 :(得分:2)

请参阅here,您需要转到步进位置参数。

答案 3 :(得分:1)

尝试这样的事情:

# Iterating through the provided arguments
for ARG in $*; do
    if [ -f filename_$ARG.txt]; then
        grep "$str" filename_$ARG.txt 
    fi
done

答案 4 :(得分:0)

args=$@;args=${args// /,}
grep "foo" $(eval echo file{$args})