(Bash) betiği arasında boşluk içeren bağımsız değişkenleri iletme


96

Aşağıdaki iki bash senaryosuna sahibim

kül:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

SomeApp ikili dosyası $*1 yerine 2 bağımsız değişken ('Benim' ve 'Bağımsız Değişken') olarak alır.

Birkaç şeyi test ettim:

  • SomeApp'i yalnızca b.shbeklendiği gibi çalıştırmak çalışır
  • Yineleyin + b.shçalışmalardaki bağımsız değişkenleri beklendiği gibi yankılayın
  • Kullanılması $@yerine $*bir fark yaratmaz

6
dene someApp "$*"veyasomeApp "$@"
Russell Uhl

1
Yupp - bir cazibe gibi çalışıyor!
John Fear

Yanıtlar:


153

$*, tırnaksız, iki kelimeye genişler. someAppTek bir argüman almak için alıntı yapmanız gerekir .

someApp "$*"

Bunun $@yerine kullanmak isteyebilirsiniz , böylece someApparama yaparsanız iki argüman alırsınız b.sh.

b.sh 'My first' 'My second'

ile someApp "$*",someApp tek bir argüman alırdı My first My second. İle someApp "$@", someAppiki argüman alır My firstve My second.


25
Kaçırılması kolay anahtar, "$ @" ifadesinin alıntılanması gerektiği gibi görünüyor. $ @ yeterli değil.
miracle2k

1
@ miracle2k Doğru. Alıntı yapılmamış $@ve $*aynı şekilde çalışın.
chepner

2
@Matt Bu tamamen farklı bir şey. "$ @" her argümanı ayrı ayrı alıntı yapması açısından özeldir. Böylelikle birden fazla tartışmaya neden olabilir. "$ bir şey", $ bir şeyin genişlediği her neyse etrafındaki alıntılardır ve her zaman tek bir argüman olacaktır.
Carlo Wood

Cevap sadece belirlersem işe yarar IFS=$'\n'. Neden olduğuna dair hiçbir fikrim yok.
Dominic M
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.