Komut satırı parametrelerini kabuk betiğinin içindeki bir programa iletme


16

Gelince ./script.sh arg1 [arg2 arg3 ...]komut satırı argümanları, arg1, arg2tarafından, ... var olabilir $1, $2... Ama argüman sayısı edilir DEĞİL sabit.

Kabuk betiğinde, arg2bir programdan başlayarak argümanları iletmek istiyorum ,

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

Bir ya da daha fazla argüman olabileceğinden bunu nasıl yapabilirim?

Yanıtlar:


18

Genel yol, arg1 ( "$1") öğesinin bir kopyasını kaydetmek ve parametreleri birer birer kaydırmaktır, böylece tüm listeye şu şekilde başvurabilirsiniz "$@":

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

bash'ın elbette bir dizi desteği var, ancak sorulduğu gibi soru için gerekli değildir.

Arg1 bile isteğe bağlı olsa , bunu şöyle kontrol edersiniz:

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

Kullanırken çift tırnak işareti gerekli $@mi?
Lee

1
Çift tırnak işareti $@, kabuğa her parametreyi çift tırnakla bildirmesini sağlar (parametreler parantez veya yıldız işareti gibi ilginç karakterler içeriyorsa hoş bir şey). Bunu umursamıyorsanız, bir sade $*çalışır ...
Thomas Dickey

6
@Evet Evet, çift tırnak işareti gerekli. Aksi takdirde, bağımsız değişkenler listesinden geçmek yerine, her bağımsız değişken boşlukta bölünür, daha sonra her parça bir joker karakter deseni olarak yorumlanır ve desen eşleşirse, eşleşme listesiyle değiştirilir. Genel olarak, her zaman çift tırnaklı değişken ikameler .
Gilles 'SO- kötü olmayı kes'

10

Parametre genişletmeyi kullanarak konumsal parametreleri dilimleyebilirsiniz. Sözdizimi:

${parameter:offset:length}

Eğer lengthatlanırsa son değere kadar alınır.

İkinci argümandan son argümanlara geçeceğiniz için ihtiyacınız olan:

${@:2}

Misal:

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

$ foo bar spam egg
spam egg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.