Saya punya perintah rsync dengan parameter berikut:
rsync -avz --{partial,stats,delete,exclude=".*"}
Saya ingin meletakkan parameter di dalam variabel untuk menggunakannya kembali setelah dalam skrip. Sesuatu seperti ini:
#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2
Saya sudah mencoba dengan tanda kutip, tanda kutip tunggal, tanda kurung, tanpa hasil.
bash
shell-script
Kellyson
sumber
sumber
Jawaban:
Menempatkan perintah kompleks dalam variabel adalah pendekatan yang tidak pernah direkomendasikan. Lihat BashFAQ / 050 - Saya mencoba untuk menempatkan perintah dalam variabel, tetapi kasus kompleks selalu gagal!
Persyaratan Anda menjadi sangat sederhana, jika Anda hanya memutuskan untuk menggunakan fungsi alih-alih variabel dan meneruskan argumen ke sana.
Sesuatu seperti
dan sekarang berikan argumen yang diperlukan sebagai
Definisi fungsinya cukup sederhana, pertama-tama kita periksa jumlah argumen input menggunakan variabel
$#
yang seharusnya tidak nol. Kami melemparkan pesan kesalahan yang mengatakan bahwa tidak ada argumen yang diberikan. Jika ada argumen yang valid, maka"$@"
mewakili argumen aktual yang disediakan untuk fungsi tersebut.Jika ini adalah fungsi yang akan Anda gunakan cukup sering yaitu di skrip / command-line juga, tambahkan ke file startup shell
.bashrc
,.bash_profile
misalnya.Atau seperti yang disebutkan, mungkin perlu untuk memperluas ekspansi brace untuk memisahkan args agar lebih mudah dibaca
sumber
Ini mencoba menjalankan perintah
-avz
dengan argumen--partial
,--stats
dll. Dan denganVAR
set kersync
dalam lingkungan.Formulir yang dikutip tidak berfungsi karena kurung kurawal tidak diperluas dalam tanda kutip, dan tidak ada di dalam assigments, dan juga tidak diperluas setelah variabel diperluas.
Jika Anda perlu menyimpan argumen baris perintah dalam variabel, gunakan array:
Sekarang
"${args[@]}"
akan diperluas untukrsync
,-avz
,--partial
, dll sebagai kata-kata yang berbeda.Array juga memungkinkan Anda untuk menambahkan opsi ke daftar, jika diperlukan secara kondisional, sehingga Anda dapat misalnya:
sumber
Anda setidaknya bisa menyimpan sebagian opsi dalam variabel:
Pengujian itu penting, karena menutupi bisa sulit:
Karena ada beberapa alternatif, seperti menggunakan riwayat, menggunakan alias, menggunakan fungsi, tidak ada use-case yang jelas yang bisa saya pikirkan. Jarang ada opsi berbagi yang rumit antara berbagai program, jadi untuk solusi ad-hoc untuk shell interaktif, aliasing tampaknya merupakan cara yang lebih baik:
Sampel anda
tidak dapat bekerja, karena penugasan berakhir di kosong pertama. Anda harus menutupi yang kosong:
hal yang cukup berbahaya untuk pengujian, dengan opsi --delete itu, bukan? Karena opsi dapat berisi lagi "," dan tanda kutip tunggal, masking bisa menjadi sangat sulit segera. Saya akan mencari alias atau mengandalkan sejarah.
Alias dapat disimpan dalam file ~ / .bashrc untuk digunakan terus menerus selama beberapa sesi. Fungsi dapat disimpan di bashrc juga, tetapi Anda hanya memerlukannya, jika Anda ingin menangani parameter, diteruskan ke fungsi yang akan dievaluasi di dalamnya.
sumber