Bagaimana cara meneruskan parameter ke perintah lain dalam skrip bash?

165

Di dalam skrip bash saya, saya ingin menguraikan nol, satu atau dua parameter (skrip dapat mengenalinya), lalu meneruskan parameter yang tersisa ke perintah yang dipanggil dalam skrip. Bagaimana saya bisa melakukan itu?

Łukasz Lew
sumber

Jawaban:

239

Gunakan shiftperintah bawaan untuk "memakan" argumen. Kemudian panggil proses anak dan berikan "$@"argumen untuk menyertakan semua argumen yang tersisa. Perhatikan kutipan, mereka harus disimpan, karena mereka menyebabkan perluasan daftar argumen dikutip dengan benar.

beristirahat
sumber
23
sebenarnya "$ @" lebih aman daripada $ *
pixelbeat
1
@pixelbeat: Terima kasih, tangkapan yang bagus. Saya diedit. @ Łukasz Lew: lihat halaman ditautkan ke dalam manual. :) Pada dasarnya, ini menangani penawaran yang lebih baik.
bersantai
22
$@pada dasarnya memperlakukan setiap elemen dari array sebagai string yang dikutip - mereka dilewatkan tanpa kesempatan untuk ekspansi. Ini juga memastikan bahwa masing-masing dipandang sebagai kata yang terpisah. Penjelasan ini bersama dengan skrip pengujian yang menunjukkan perbedaan ada di sini: tldp.org/LDP/abs/html/internalvariables.html#APPREF
Cascabel
2
Perhatikan menggunakan kutipan! Baca lebih lanjut tentang mengapa ini penting bagi mereka di sini: stackoverflow.com/a/4824637/4575793
Cadoiz
32

bash menggunakan perintah shift :

misal shifttest.sh:

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

shifttest.sh 1 2 3 menghasilkan

1
2 3
Steve B.
sumber
2
@ TamásZahola peduli untuk menjelaskan?
Kyle Chadha
2
Jika Anda meneruskan argumen $1tanpa mengutipnya "$1", maka shell akan melakukan pemisahan kata, jadi mis. foo barAkan diteruskan sebagai foodan barsecara terpisah.
Tamás Zahola
Baca lebih lanjut tentang mengapa memiliki double "di sekitar sini: stackoverflow.com/a/4824637/4575793
Cadoiz
1
Otak saya mencampuradukkan beberapa huruf dalam "shifttest" dan akibatnya saya membacanya sebagai sesuatu yang lain.
Alex
21

Bash mendukung parameter subset (lihat Subset dan substring ), sehingga Anda dapat memilih parameter mana untuk diproses / lulus seperti ini.

  1. buka file baru dan edit: 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. menjalankannya:

    $ chmod u+x r.sh
    $ ./r.sh 1 2 3 4 5 6 7 8 9 10
  3. hasilnya adalah:

    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
Robert Lujo
sumber