在bash脚本中迭代参数并使用它们的数字

use*_*638 4 bash command-line loops

如果我想迭代所有参数,那就很简单了for i in "$@"; do ....但是,假设我想从第二个参数开始,并且还使用参数的位置进行一些基本计算.

作为一个例子,我想将这些命令缩短为一个循环:

grep -v 'foobar' "$2" | grep -f $file > output1.txt
grep -v 'foobar' "$3" | grep -f $file > output2.txt
grep -v 'foobar' "$4" | grep -f $file > output3.txt
grep -v 'foobar' "$5" | grep -f $file > output4.txt
Run Code Online (Sandbox Code Playgroud)

我试过很多变化,比如for i in {2..5}; do grep -v 'foobar' "$$i" | grep -f $file > output$(($i-1)).txt; done; 然而,似乎bash扩展不会像这样工作.

编辑:

似乎我犯了一个错误,没有强调我需要利用参数的位置/数字(即2来自$2).这很重要,因为输出文件稍后会在脚本中单独使用.到目前为止,所有提供的答案似乎都是正确的,但我不知道如何使用它们来使用参数的"数字".

Jst*_*lls 7

已经有几个正确答案,另一种方法可能是:

for (( i=2; i <= "$#"; i++ )); do
    echo "arg position: ${i}"
    echo "arg value: ${!i}"
done
Run Code Online (Sandbox Code Playgroud)


Dav*_*ica 7

您还可以直接使用数组索引:

#!/bin/bash
for i in "${@:2}"; do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

它将迭代从第二个参数开始的参数。当引用时,它还会保留参数中的空格。例如

$ bash args.sh one two "three four" five
two
three four
five
Run Code Online (Sandbox Code Playgroud)


and*_*lrc 6

如果你希望推卸第一不必要的争论,你可以使用间接扩展:

for i in {2..5}; do
  echo "${!i}"
done
Run Code Online (Sandbox Code Playgroud)