Передать параметры командной строки в программу внутри сценария оболочки

15

Что же касается ./script.sh arg1 [arg2 arg3 ...], аргументов командной строки arg1, arg2... может быть приобретено $1, $2... Но число аргументов НЕ фиксировано.

В сценарии оболочки я хочу передать аргументы, начиная с arg2программы,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

Как я мог это сделать, поскольку может быть один или несколько аргументов?

подветренный
источник

Ответы:

17

Обычным способом было бы сохранить копию arg1 ( "$1") и сдвинуть параметры на один, чтобы вы могли ссылаться на весь список как "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

Конечно, bash поддерживает некоторые массивы, но это не нужно для поставленного вопроса.

Если даже arg1 является необязательным, вы можете проверить это следующим образом:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi
Томас Дики
источник
Нужны ли двойные кавычки при использовании $@?
Ли
1
Двойные кавычки с $@сообщают оболочке заключать в кавычки каждый параметр (что приятно делать, если параметры содержат интересные символы, такие как круглые скобки или звездочки). Если вас это не волнует, просто $*работает ...
Томас Дики
6
@ Ли Да, двойные кавычки необходимы. В противном случае вместо прохождения списка аргументов каждый аргумент разбивается на пробел, затем каждый фрагмент интерпретируется как шаблон с подстановочными знаками и, если шаблон соответствует, заменяется списком совпадений. Вообще говоря, всегда двойные кавычки подстановок переменных .
Жиль "ТАК - перестань быть злым"
10

Вы можете нарезать позиционные параметры, используя расширение параметров. Синтаксис:

${parameter:offset:length}

Если lengthопущено, оно принимается до последнего значения.

Поскольку вы должны были передать от второго до последнего аргумента, вам нужно:

${@:2}

Пример:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
heemayl
источник