Как передать все аргументы, переданные моей bash script, на мою функцию?
Допустим, я определил function abc()
которая будет обрабатывать логику, связанную с анализом аргументов, передаваемых моему сценарию.
Как я могу передать все аргументы, которые получил мой bash-скрипт? Количество параметров является переменным, поэтому я не могу просто жестко закодировать аргументы, передаваемые следующим образом:
abc $1 $2 $3 $4
Редактировать А еще лучше, есть ли способ, чтобы моя функция имела доступ к переменным аргументов скрипта?
Ответы
Ответ 1
Переменная [email protected]
распространяется на все параметры командной строки, разделенные пробелами. Вот пример.
abc "[email protected]"
При использовании [email protected]
вы должны (почти) всегда ставить его в двойные кавычки, чтобы избежать неправильного разбора аргументов, содержащих пробелы или символы подстановки. Это работает для нескольких аргументов. "$*"
будет передаваться как одна длинная строка.
Также ничего не стоит, что $0
нет в [email protected]
.
В разделе специальных параметров Справочного руководства Bash говорится, что [email protected]
расширяется до позиционных параметров, начиная с единицы. Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово. То есть "[email protected]"
эквивалентно "$1" "$2" "$3"...
.
Если вы хотите передать все аргументы, кроме первых, вы можете сначала использовать shift
для "потребления" первого аргумента, а затем передать [email protected]
для передачи оставшихся аргументов другой команде. В bash (но не в простых оболочках POSIX) вы можете сделать это, не связываясь со списком аргументов, используя вариант среза массива: "${@:3}"
получит вам аргументы, начинающиеся с "$3"
. "${@:3:4}"
даст вам до четырех аргументов, начиная с "$3"
(то есть "$3" "$4" "$5" "$6"
), если было передано столько аргументов.
Ответ 2
Мне нужен был вариант, который я ожидаю, будет полезен другим:
function diffs() {
diff "${@:3}" <(sort "$1") <(sort "$2")
}
Часть "${@:3}"
означает все члены массива, начиная с 3. Таким образом, эта функция реализует сортированный diff, передавая первые два аргумента diff через сортировку, а затем передавая все другие аргументы diff, поэтому вы можете назвать это аналогично diff:
diffs file1 file2 [other diff args, e.g. -y]
Ответ 3
Используйте переменную [email protected]
, которая расширяется до всех параметров командной строки, разделенных пробелами.
abc "[email protected]"
Ответ 4
Вот простой скрипт:
#!/bin/bash
args=("[email protected]")
echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}
$#
- количество аргументов, полученных скриптом. Мне проще получить к ним доступ с помощью массива: строка args=("[email protected]")
помещает все аргументы в массив args
. Для доступа к ним используйте ${args[index]}
.
Ответ 5
Стоит отметить, что вы можете указать диапазоны аргументов с этим синтаксисом.
function example() {
echo "line1 ${@:1:1}"; #First argument
echo "line2 ${@:2:1}"; #Second argument
echo "line3 ${@:3}"; #Third argument onwards
}
Я не видел, чтобы это упоминалось.
Ответ 6
abc "[email protected]"
[email protected]
представляет все параметры, указанные вашему bash script.
Ответ 7
abc "$ @", как правило, правильный ответ. Но я пытался передать параметр в команду su, и никакие кавычки не могли остановить ошибку su: unrecognized option '--myoption'
. То, что действительно работало для меня, передавало все аргументы одной строкой:
abc "$*"
Мой точный случай (я уверен, что кому-то еще это нужно) был в моем .bashrc
# run all aws commands as Jenkins user
aws ()
{
sudo su jenkins -c "aws $*"
}