Выполнение итерации «один против других» через аргументы сценария Bash - PullRequest
1 голос
/ 20 октября 2019

Я хочу запустить скрипт 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 Ответ

3 голосов
/ 20 октября 2019

Вы можете сделать это очень похожим образом в bash, используя косвенное расширение ("${!argnum}") для получения отдельных аргументов и синтаксис, похожий на разбиение массива, чтобы получить их диапазоны ("${@:startarg:numargs}" и "${@:startarg}"). Примерно так:

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

Если вы хотите использовать явный массив others, создайте его так:

others=("${@:1:i-1}" "${@:i+1}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...