Lewati parameter baris perintah ke program di dalam skrip shell

15

Adapun ./script.sh arg1 [arg2 arg3 ...], argumen baris perintah arg1, arg2, ... bisa didapat oleh $1, $2, ... Tapi jumlah argumen yang tidak tetap.

Dalam skrip shell, saya ingin meneruskan argumen mulai dari arg2ke program,

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

Bagaimana saya bisa melakukannya karena mungkin ada satu atau lebih argumen?

Lee
sumber

Jawaban:

17

Cara biasa akan menyimpan salinan arg1 ( "$1") dan menggeser parameter dengan satu, sehingga Anda dapat merujuk ke seluruh daftar sebagai "$@":

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

bash tentu saja memiliki dukungan array, tetapi tidak diperlukan untuk pertanyaan yang diajukan.

Jika bahkan arg1 adalah opsional, Anda akan memeriksanya seperti ini:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi
Thomas Dickey
sumber
Apakah kutipan ganda diperlukan saat menggunakan $@?
Lee
1
Tanda kutip ganda dengan $@memberi tahu shell untuk memberi tanda kutip ganda pada setiap parameter (sesuatu yang menyenangkan dilakukan jika parameter tersebut mengandung karakter yang menarik seperti tanda kurung atau tanda bintang). Jika Anda tidak peduli tentang itu, sebuah $*karya sederhana ...
Thomas Dickey
6
@ Lee Ya, tanda kutip ganda diperlukan. Kalau tidak, alih-alih melewati daftar argumen, setiap argumen dibagi di whitespace, lalu masing-masing argumen ditafsirkan sebagai pola wildcard dan, jika polanya cocok, itu diganti oleh daftar kecocokan. Secara umum, berbicara, selalu substitusi variabel kutipan ganda .
Gilles 'SANGAT berhenti menjadi jahat'
10

Anda dapat mengiris parameter posisi menggunakan ekspansi parameter. Sintaksnya adalah:

${parameter:offset:length}

Jika lengthdihilangkan itu diambil sampai nilai terakhir.

Saat Anda beralih dari argumen kedua ke argumen terakhir, Anda perlu:

${@:2}

Contoh:

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

$ foo bar spam egg
spam egg
heemayl
sumber