10

Как передать все аргументы, переданные в Bash-скрипт, в мою функцию?

8

У меня есть функция abc(), которая обрабатывает логику, связанную с анализом аргументов, переданных в мой Bash-скрипт. Как я могу передать все аргументы, которые мой Bash-скрипт получил, в функцию abc()? Количество аргументов переменное, поэтому я не могу просто жестко закодировать передаваемые аргументы, как это:

abc $1 $2 $3 $4

Есть ли способ, чтобы моя функция имела доступ к переменным аргументов скрипта?

5 ответ(ов)

1

Вы можете использовать следующую функцию для реализации упорядоченного сравнения файлов с возможностью передачи дополнительных аргументов:

function diffs() {
    diff "${@:3}" <(sort "$1") <(sort "$2")
}

В этой функции часть "${@:3}" означает, что передаются все аргументы, начиная с третьего. Таким образом, эта функция реализует сортированный дифф при помощи diff, передавая первые два аргумента в diff через sort, а также позволяя передать любые другие аргументы в diff. Используйте её аналогично команде diff:

diffs file1 file2 [другие аргументы для diff, например, -y]

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

0

Вы можете использовать переменную $@, которая расширяется в все параметры командной строки, разделенные пробелами.

Например, следующий код:

abc "$@"

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

0

Вот простой скрипт:

#!/bin/bash

args=("$@")

echo Количество аргументов: $#
echo 1-й аргумент: ${args[0]}
echo 2-й аргумент: ${args[1]}

$# — это количество аргументов, переданных скрипту. Мне проще получать доступ к аргументам, используя массив: строка args=("$@") помещает все аргументы в массив args. Чтобы обратиться к ним, используйте ${args[index]}.

0

Стоит упомянуть, что вы можете задавать диапазоны аргументов с помощью следующего синтаксиса:

function example() {
    echo "line1 ${@:1:1}"; # Первый аргумент
    echo "line2 ${@:2:1}"; # Второй аргумент
    echo "line3 ${@:3}";   # Третий аргумент и далее
}

Я не видел, чтобы это упоминали ранее.

0

В общем случае правильным решением будет использовать abc "$@". Однако, когда я пытался передать параметр в команду su, никакое экранирование не помогало и возникала ошибка su: unrecognized option '--myoption'. То, что действительно сработало для меня, — это передача всех аргументов как одна строка:

abc "$*"

Мой конкретный случай (я уверен, что это может пригодиться и другим) был в моём файле .bashrc:

# Выполнять все команды aws от имени пользователя Jenkins
aws ()
{
    sudo su jenkins -c "aws $*"
}
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь