在 for 循环中无序访问位置参数

在 for 循环中无序访问位置参数

我有一个脚本,它使用来自命令行的多个(即位置)参数,并在其中循环for遍历这些参数:

for i in "$@"; do 
...
done

这意味着参数将$i按照在命令行上指定的顺序逐个填充。

这似乎意味着不可能选择当前未填充的参数 $i

例如,在我的脚本的下面一行中,我需要引用两个不同的变量,在循环之外它们分别for是和:$1$2$1

ffmpeg -i "$i" -i "$i" ... "${i%.*}.mp4"

该脚本的执行格式如下:

./script.sh image.jpg *.flac

...但据我了解,这个问题甚至适用于不支持 glob 的脚本。

是否可以for根据需要从循环中访问位置参数,而不是简单地按照指定顺序访问?

答案1

我最终还是弄明白了这一点,尽管我不认为这是一个完美的答案,因为它不满足能够从循环中引用参数的要求for

从这个意义上说,我认为这个答案更像是一种解决方法,我非常高兴有人能来以更全面的方式直接回答这个问题。无论如何,这是一种适用于我当前脚本的解决方法。

  img="$1"
  shift
  for i in "$@"; do
  ...
  ffmpeg -i "$img" -i "$i" ... "${i%.*}.mp4"
  ...
  done

据我所知,这是通过将第一个参数分配给循环$img外的变量来实现的for$img脚本中的每个实例都由shift(与 相同shift 1)处理,然后丢弃,然后再转到下一个实例。

一旦从参数列表中删除所有 $img 参数,循环for就会使用来$@正常循环遍历剩余的参数。

然后可以使用以下命令调用该脚本:

./script.sh customimage.png *.flac

或者对于$img变量的多个实例:

./script.sh customimage.png custom-image2.jpg *.flac

相关内容