Как передать все аргументы, переданные моей 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
}

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

Ответ 7

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

abc "$*"

Мой точный случай (я уверен, что кому-то еще это нужно) был в моем .bashrc

# run all aws commands as Jenkins user
aws ()
{
    sudo su jenkins -c "aws $*"
}