Як переслати параметри іншій команді в bash script?


165

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

Відповіді:


239

Використовуйте shiftвбудовану команду, щоб "з'їсти" аргументи. Потім викличте дочірній процес і передайте йому "$@"аргумент, щоб включити всі аргументи, що залишилися. Зауважте, цитати їх слід зберігати, оскільки вони викликають розширення списку аргументів належним чином.


23
насправді "$ @" безпечніше, ніж $ *
піксельбит

1
@pixelbeat: Дякую, хороший улов. Я редагував. @ Łukasz Lew: див. Пов'язану сторінку в посібнику. :) В основному, це справляється з цитуванням краще.
розмотайте

22
$@по суті, розглядає кожен елемент масиву як цитований рядок - вони передаються разом без можливості розширення. Це також забезпечує те, що кожне розглядається як окреме слово. Це пояснення разом із тестовим сценарієм, що демонструє різницю, тут: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel

2
Зверніть увагу на використання цитат! Детальніше про те, чому важливо їх тут: stackoverflow.com/a/4824637/4575793
Cadoiz

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окремо.
Tamás Zahola

Детальніше про те, чому важливо мати подвійний "тут: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.