Как передать все аргументы, переданные моему скрипту bash, в мою функцию? - PullRequest
505 голосов
/ 28 сентября 2010

Допустим, я определил function abc(), который будет обрабатывать логику, связанную с анализом аргументов, переданных моему сценарию.

Как я могу передать все аргументы, которые получил мой bash-скрипт? Количество параметров является переменным, поэтому я не могу просто жестко закодировать аргументы, передаваемые следующим образом:

abc $1 $2 $3 $4

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

Ответы [ 7 ]

812 голосов
/ 29 сентября 2010

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

abc "$@"

При использовании $@ вы должны (почти) всегда ставить его в двойные кавычки, чтобы избежать неправильного разбора аргумента с пробелами в них.Это работает для нескольких аргументов.$* будет передано как одна длинная строка.

Также ничего не стоит, если $0 отсутствует в $@.

Раздел специальных параметров Справочного руководства Bash говорит, что @ расширяется до параметров positiaonl начиная с единицы.Когда раскрытие происходит в двойных кавычках, каждый параметр раскрывается в отдельное слово.То есть "$@" эквивалентно "$1" "$2" "$3"....

Если вы хотите передать все, кроме первых аргументов, вы можете сначала использовать shift, чтобы «потреблять» первый аргумент изатем передайте $@, чтобы передать оставшиеся аргументы другой команде.В bash (но не в простых оболочках POSIX) вы можете сделать это, не связываясь со списком аргументов, используя вариант среза массива: "${@:3}" вернет вам аргументы, начинающиеся с "$3"."${@:3:4}" даст вам до четырех аргументов, начиная с "$3" (то есть "$3" "$4" "$5" "$6"), если было передано столько аргументов.

134 голосов
/ 17 октября 2012

Мне нужен был вариант этого, который, как я ожидаю, будет полезен для других:

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

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

diffs file1 file2 [other diff args, e.g. -y]
51 голосов
/ 28 сентября 2010

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

abc "$@"
42 голосов
/ 28 сентября 2010

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

#!/bin/bash

args=("$@")

echo Number of arguments: $#
echo 1st argument: ${args[0]}
echo 2nd argument: ${args[1]}

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

32 голосов
/ 21 марта 2016

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

function example() {
    echo "line1 ${@:1:1}"; #First argument
    echo "line2 ${@:2:1}"; #Second argument
    echo "line3 ${@:3}"; #Third argument onwards
}

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

15 голосов
/ 28 сентября 2010
abc "$@"

$@ представляет все параметры, данные вашему bash-скрипту.

8 голосов
/ 22 ноября 2018

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

abc "$*"

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

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