Передайте параметри командного рядка програмі всередині сценарію оболонки


16

Що ж стосується ./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]
...

Як я міг це зробити, оскільки міг бути один або кілька аргументів?

Відповіді:


18

Звичайним способом було б збереження копії arg1 ( "$1") і зміщення параметрів на одне, так що ви можете посилатися на весь список як "$@":

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

bash має певну підтримку масиву, звичайно, але це не потрібно для поставленого питання.

Якщо навіть arg1 необов’язковий, ви перевірите його так:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

Чи потрібні подвійні лапки під час використання $@?
Лі

1
Подвійні лапки з $@вказує оболонці подвійне цитування кожного параметра (щось приємно зробити, якщо параметри містять цікаві символи, такі як дужки або зірочки). Якщо вас це не хвилює, звичайна $*робота ...
Томас Дікі

6
@Lee Так, подвійні лапки необхідні. В іншому випадку, замість того, щоб переходити через список аргументів, кожен аргумент розділяється на пробіл, тоді кожен фрагмент інтерпретується як шаблон підстановки і, якщо шаблон відповідає, він замінюється на список збігів. Взагалі кажучи, завжди подвійне цитування змінних підстановок .
Жил 'SO- перестань бути злим'

10

Ви можете нарізати позиційні параметри, використовуючи розширення параметрів. Синтаксис:

${parameter:offset:length}

Якщо lengthпропущено, воно приймається як останнє значення.

Під час передачі аргументів від другого до останнього вам потрібно:

${@:2}

Приклад:

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

$ foo bar spam egg
spam egg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.