Saya sedang menulis skrip bash di mana saya harus meneruskan string yang berisi spasi ke fungsi di skrip bash saya.
Sebagai contoh:
#!/bin/bash
myFunction
{
echo $1
echo $2
echo $3
}
myFunction "firstString" "second string with spaces" "thirdString"
Saat dijalankan, output yang saya harapkan adalah:
firstString
second string with spaces
thirdString
Namun, sebenarnya apa yang dihasilkan adalah:
firstString
second
string
Apakah ada cara untuk melewatkan string dengan spasi sebagai argumen tunggal ke fungsi dalam bash?
echo "$@"
ataufor i in "$@"; do echo $i ; done
gunakan parameter yang dikutip dengan benar yang berisi spasi. Ini adalah yang sangat jelas disebutkan dalam semuabash
dokumentasi di bawahpositional parameters
bagian.myFunction "$@"
Jawaban:
Anda harus memberi tanda kutip dan juga, deklarasi fungsi Anda salah.
Dan seperti yang lain, itu bekerja untuk saya juga. Beri tahu kami versi shell yang Anda gunakan.
sumber
$@
berperilaku seperti tanda kutip$*
- hasilnya adalah string-split dan kemudian secara individual diperluas, jadi jika Anda memiliki tab, mereka akan dikonversi menjadi spasi, jika Anda memiliki kata-kata yang dapat dievaluasi sebagai ekspresi glob mereka akan, dll.Solusi lain untuk masalah di atas adalah mengatur setiap string ke variabel, panggil fungsi dengan variabel yang ditandai oleh tanda dolar literal
\$
. Kemudian dalam fungsi gunakaneval
untuk membaca variabel dan output seperti yang diharapkan.Outputnya adalah:
Dalam mencoba memecahkan masalah yang mirip dengan ini, saya mengalami masalah UNIX berpikir variabel saya dibatasi oleh ruang. Saya mencoba untuk melewatkan string yang dibatasi pipa ke fungsi yang digunakan
awk
untuk mengatur serangkaian variabel yang nantinya digunakan untuk membuat laporan. Saya awalnya mencoba solusi yang diposting oleh ghostdog74 tetapi tidak bisa berfungsi karena tidak semua parameter saya diteruskan dalam tanda kutip. Setelah menambahkan tanda kutip ganda untuk setiap parameter kemudian mulai berfungsi seperti yang diharapkan.Di bawah ini adalah status sebelum kode saya dan berfungsi penuh setelah status.
Sebelum - Kode Tidak Berfungsi
Setelah - Kode Berfungsi
sumber
Solusi paling sederhana untuk masalah ini adalah Anda hanya perlu menggunakan
\"
argumen yang dipisahkan oleh ruang saat menjalankan skrip shell:sumber
Definisi myFunction Anda salah. Harus:
atau:
Bagaimanapun, ini terlihat baik dan berfungsi dengan baik untuk saya di Bash 3.2.48.
sumber
Saya terlambat 9 tahun, tetapi cara yang lebih dinamis
sumber
Solusi sederhana yang berhasil untuk saya - dikutip $ @
Saya bisa memverifikasi perintah grep yang sebenarnya (terima kasih untuk set -x).
sumber
Anda dapat memiliki ekstensi masalah ini jika teks awal Anda diatur ke variabel tipe string, misalnya:
Dalam hal ini, jika Anda tidak meneruskan variabel status_message ke depan sebagai string (dikelilingi oleh ""), variabel itu akan dibagi menjadi serangkaian argumen yang berbeda.
"$ variable" : Trek saat ini adalah CDE di DEF oleh ABC
$ variabel : The
sumber
myFunction "firstString" "second string with spaces" "thirdString"
dan itu tidak berhasil untuknya. Jadi apa yang Anda usulkan tidak berlaku untuk pertanyaan ini.Punya masalah yang sama dan sebenarnya masalahnya bukan fungsi atau fungsi panggilan, tapi apa yang saya sampaikan sebagai argumen untuk fungsi.
Fungsi dipanggil dari badan skrip - 'utama' - jadi saya melewati "st1 a b" "st2 c d" "st3 e f" dari baris perintah dan meneruskannya ke fungsi menggunakan myFunction $ *
$ * Menyebabkan masalah saat ia mengembang menjadi seperangkat karakter yang akan ditafsirkan dalam panggilan ke fungsi menggunakan spasi sebagai pembatas.
Solusinya adalah mengubah panggilan ke fungsi dalam penanganan argumen eksplisit dari 'utama' ke fungsi: panggilan itu kemudian akan menjadi myFunction "$ 1" "$ 2" "$ 3" yang akan melestarikan spasi putih di dalam string karena tanda kutip akan membatasi argumen ... Jadi jika parameter dapat berisi spasi, harus ditangani secara eksplisit di seluruh panggilan fungsi.
Karena ini mungkin menjadi alasan pencarian panjang untuk masalah, mungkin bijaksana untuk tidak menggunakan $ * untuk melewati argumen ...
Semoga ini bisa membantu seseorang, suatu hari nanti, di suatu tempat ... Jan.
sumber
"$@"
, tidak semua dikutip"$1"
,"$2"
, ... paramters posisi atau$*
.