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).这很重要,因为输出文件稍后会在脚本中单独使用.到目前为止,所有提供的答案似乎都是正确的,但我不知道如何使用它们来使用参数的"数字".
已经有几个正确答案,另一种方法可能是:
for (( i=2; i <= "$#"; i++ )); do
echo "arg position: ${i}"
echo "arg value: ${!i}"
done
Run Code Online (Sandbox Code Playgroud)
您还可以直接使用数组索引:
#!/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)
如果你不希望推卸第一不必要的争论,你可以使用间接扩展:
for i in {2..5}; do
echo "${!i}"
done
Run Code Online (Sandbox Code Playgroud)