Как передать все аргументы, переданные в Bash-скрипт, в мою функцию?
У меня есть функция abc()
, которая обрабатывает логику, связанную с анализом аргументов, переданных в мой Bash-скрипт. Как я могу передать все аргументы, которые мой Bash-скрипт получил, в функцию abc()
? Количество аргументов переменное, поэтому я не могу просто жестко закодировать передаваемые аргументы, как это:
abc $1 $2 $3 $4
Есть ли способ, чтобы моя функция имела доступ к переменным аргументов скрипта?
5 ответ(ов)
Вы можете использовать следующую функцию для реализации упорядоченного сравнения файлов с возможностью передачи дополнительных аргументов:
function diffs() {
diff "${@:3}" <(sort "$1") <(sort "$2")
}
В этой функции часть "${@:3}"
означает, что передаются все аргументы, начиная с третьего. Таким образом, эта функция реализует сортированный дифф при помощи diff
, передавая первые два аргумента в diff
через sort
, а также позволяя передать любые другие аргументы в diff
. Используйте её аналогично команде diff
:
diffs file1 file2 [другие аргументы для diff, например, -y]
Это позволит вам выполнять сравнение файлов с сортировкой и при этом настраивать дополнительные параметры, что может быть полезно в различных ситуациях.
Вы можете использовать переменную $@
, которая расширяется в все параметры командной строки, разделенные пробелами.
Например, следующий код:
abc "$@"
позволит передать все аргументы, переданные скрипту, в команду abc
, сохраняя при этом их первоначальный формат, включая возможность передачи аргументов с пробелами, если они заключены в кавычки.
Вот простой скрипт:
#!/bin/bash
args=("$@")
echo Количество аргументов: $#
echo 1-й аргумент: ${args[0]}
echo 2-й аргумент: ${args[1]}
$#
— это количество аргументов, переданных скрипту. Мне проще получать доступ к аргументам, используя массив: строка args=("$@")
помещает все аргументы в массив args
. Чтобы обратиться к ним, используйте ${args[index]}
.
Стоит упомянуть, что вы можете задавать диапазоны аргументов с помощью следующего синтаксиса:
function example() {
echo "line1 ${@:1:1}"; # Первый аргумент
echo "line2 ${@:2:1}"; # Второй аргумент
echo "line3 ${@:3}"; # Третий аргумент и далее
}
Я не видел, чтобы это упоминали ранее.
В общем случае правильным решением будет использовать abc "$@"
. Однако, когда я пытался передать параметр в команду su
, никакое экранирование не помогало и возникала ошибка su: unrecognized option '--myoption'
. То, что действительно сработало для меня, — это передача всех аргументов как одна строка:
abc "$*"
Мой конкретный случай (я уверен, что это может пригодиться и другим) был в моём файле .bashrc
:
# Выполнять все команды aws от имени пользователя Jenkins
aws ()
{
sudo su jenkins -c "aws $*"
}
Проверьте количество аргументов, переданных Bash-скрипту
Передача параметров в функцию Bash
Извлечение имени файла и расширения в Bash
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?