Meneruskan argumen dengan spasi di antara skrip (bash)

94

Saya punya dua skrip bash berikut

Abu:

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

b.sh:

#!/bin/bash
someApp $*

Biner someApp menerima $*sebagai 2 argumen ('Saya' dan 'Argumen'), bukan 1.

Saya telah menguji beberapa hal:

  • Menjalankan someApp hanya melalui b.shberfungsi seperti yang diharapkan
  • Iterasi + gema argumen dalam b.shkarya seperti yang diharapkan
  • Menggunakan $@alih-alih $*tidak membuat perbedaan
John Fear
sumber
6
coba someApp "$*"atausomeApp "$@"
Russell Uhl
1
Yupp - bekerja seperti pesona!
John Fear

Jawaban:

152

$*, tanpa tanda kutip, berkembang menjadi dua kata. Anda perlu mengutipnya sehingga someAppmenerima satu argumen.

someApp "$*"

Mungkin Anda ingin menggunakan $@sebagai gantinya, sehingga someAppakan menerima dua argumen jika Anda memanggil b.shsebagai

b.sh 'My first' 'My second'

Dengan someApp "$*", someAppakan menerima satu argumen My first My second. Dengan someApp "$@", someAppakan menerima dua argumen, My firstdan My second.

chepner
sumber
25
Kunci yang mudah terlewatkan adalah "$ @" perlu dikutip, tampaknya. $ @ tidak cukup.
miracle2k
1
@ miracle2 Benar. Tidak dikutip, $@dan $*bekerja dengan identik.
chepner
2
@Matt Itu adalah sesuatu yang sama sekali berbeda. "$ @" adalah spesial karena mengutip setiap argumen secara terpisah. Dengan demikian, hal ini dapat menghasilkan lebih dari satu argumen. "$ sesuatu" hanyalah tanda kutip di sekitar $ sesuatu yang diperluas dan akan selalu menjadi satu argumen.
Carlo Wood
Jawabannya hanya berfungsi untuk saya jika saya menetapkan IFS=$'\n'. Tidak tahu kenapa.
Dominic M