функция Баш с тремя до бесконечно аргументов - PullRequest
1 голос
/ 26 марта 2019

Предположим, у меня есть некоторый скрипт на python argparse, который я хотел бы использовать в качестве псевдонима с помощью функции bash.

Предположим, этот скрипт на python принимает четыре аргумента:

--arg1
--arg2
--arg3
--arg4

Чего я хотел бы добиться, так это взять первые два аргумента в фиксированных позициях, а затем бесконечно добавлять необязательные аргументы.

function foo()  {  python3 script.py --arg1 "$1" --arg2 "$2" "$@";  }

Так что-то вроде этого:

foo value1 value2 --arg3 value3 --arg4 value4

Однако, $ @ начинает считать с 1.

Как мне этого добиться?

Ответы [ 3 ]

2 голосов
/ 26 марта 2019

Разделите массив позиционных аргументов после 2-го до остальной части списка, как показано ниже. Также удалите нестандартное ключевое слово function из определения.

foo() {  
   python3 script.py --arg1 "$1" --arg2 "$2" "${@:3:$#}"
}

Также обратите внимание, что последний аргумент $# необязателен при разрезании списка. Без этого понятно, что конец - это конечный позиционный аргумент.

Кроме того, такой способ анализа аргументов может быть сложным, если добавлено больше позиционных аргументов или изменен порядок аргументов. Для более эффективного анализа аргументов рассмотрите возможность использования getopts (его эквивалентный модуль Python).

1 голос
/ 26 марта 2019

$@ действительно массив в Bash, поэтому вы можете получить доступ к произвольному элементу (элементам) с синтаксисом ${@:start:length}:

function foo() {
  python3 script.py --arg1 "$1" --arg2 "$2" "${@:3}"
}

Здесь, когда length опущен, предполагается, что он достаточно длинный, чтобы содержать все оставшиеся элементы.

shift, затем используйте $@ в качестве альтернативы:

function foo() {
  arg1="$1"
  arg2="$2"
  shift 2
  python3 script.py --arg1 "$arg1" --arg2 "$arg2" "$@"
}
1 голос
/ 26 марта 2019

Сохраните $1 и $2 в локальные переменные, а затем используйте shift, чтобы переместить переменные так, чтобы $@ больше их не включал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...