通过Bash脚本参数进行“一对别”迭代

时间:2019-10-20 18:10:50

标签: bash

我想运行这样的Bash脚本:

./myscript.sh A B C D E F

,然后在脚本中我想有一个循环来运行这些命令:

somecommand -x A -y B C D E F
somecommand -x B -y A C D E F
somecommand -x C -y A B D E F
somecommand -x D -y A B C E F
somecommand -x E -y A B C D F
somecommand -x F -y A B C D E

执行此操作的最佳方法是什么?在python中,我会做类似的事情:

for i, first in enumerate(sys.argv[1:]):
    others = sys.argv[1:i] + sys.argv[i+1:]
    do_command(first, others)

但是我不确定如何在Bash中执行类似的操作。

1 个答案:

答案 0 :(得分:3)

您可以在bash中非常相似地执行此操作,使用间接扩展(label)获取单个参数,并使用类似于数组切片的语法获取它们的范围("${!argnum}"和{{1 }})。像这样:

"${@:startarg:numargs}"

如果要使用显式"${@:startarg}"数组,请按以下方式创建它:

for ((i=1; i<=$#; i++)); do
    somecommand -x "${!i}" -y "${@:1:i-1}" "${@:i+1}"
done