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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.