Как передать параметры другой команде в скрипте bash?

165

В моем bash-скрипте я хотел бы проанализировать ноль, один или два параметра (скрипт может их распознать), а затем переслать оставшиеся параметры команде, вызванной в скрипте. Как я могу это сделать?

Лукаш Лью
источник

Ответы:

239

Используйте shiftвстроенную команду, чтобы «съесть» аргументы. Затем вызовите дочерний процесс и передайте ему "$@"аргумент для включения всех оставшихся аргументов. Обратите внимание на кавычки, они должны быть сохранены, так как они приводят к правильному расширению списка аргументов.

размотать
источник
23
на самом деле «$ @» безопаснее, чем $ *
pixelbeat
1
@pixelbeat: Спасибо, хороший улов. Я отредактировал. @ Лукаш Лью: см. Ссылку на страницу в руководстве. :) В основном, он лучше обрабатывает цитирование.
расслабиться
22
$@по сути, каждый элемент массива обрабатывается как строка в кавычках - они передаются без возможности расширения. Это также гарантирует, что каждый рассматривается как отдельное слово. Это объяснение вместе с тестовым сценарием, демонстрирующим разницу, находится здесь: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel
2
Обратите внимание на использование кавычек! Подробнее о том, почему это так важно,
читайте
32

bash использует команду shift :

например, shifttest.sh:

#!/bin/bash
echo $1
shift
echo $1 $2

shifttest.sh 1 2 3 производит

1
2 3
Стив Б.
источник
2
@ TamásZahola хотите объяснить?
Кайл Чадха
2
Если вы передадите аргументы как $1без кавычек "$1", то оболочка выполнит разбиение слов, например, foo barбудет переадресовано как fooи barотдельно.
Тамас Захола
Узнайте больше о том, почему важно иметь двойник "здесь: stackoverflow.com/a/4824637/4575793
Cadoiz
1
Мой мозг перемешал пару писем в «shifttest», и я, следовательно, прочитал это как что-то еще.
Алекс
21

Bash поддерживает параметры поднабора (см. Подмножества и подстроки ), поэтому вы можете выбрать, какие параметры обрабатывать / передавать следующим образом.

  1. откройте новый файл и отредактируйте его: vim r.sh:

    echo "params only 2    : ${@:2:1}"
    echo "params 2 and 3   : ${@:2:2}"
    echo "params all from 2: ${@:2:99}"
    echo "params all from 2: ${@:2}"
  2. запустить его:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. результат:

    params only 2    : 2
    params 2 and 3   : 2 3
    params all from 2: 2 3 4 5 6 7 8 9 10
    params all from 2: 2 3 4 5 6 7 8 9 10
Роберт Лужо
источник