Bagaimana saya bisa menggabungkan variabel shell ke parameter lain di baris perintah saya?

16

Bagaimana saya bisa menggabungkan variabel shell ke parameter lain di baris perintah saya?

Sebagai contoh,

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > $WEBSITE.sql

Saya perlu concatenate .sqluntuk$WEBSITE

aneuryzm
sumber

Jawaban:

26

Menggunakan ${ } untuk melampirkan variabel.

Tanpa kurung keriting:

VAR="foo"
echo $VAR
echo $VARbar

akan memberi

foo

dan tidak ada, karena variabel $VARbar tidak ada.

Dengan kurung keriting:

VAR="foo"
echo ${VAR}
echo ${VAR}bar

akan memberi

foo
foobar

Tutup dulu $VAR tidak perlu, tetapi praktik yang baik.

Sebagai contoh Anda:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword ${WEBSITE} > ${WEBSITE}.sql

Ini bekerja untuk bash, zsh, ksh, mungkin orang lain juga.

mengibaskan
sumber
3
Ini bekerja untuk semua kerang gaya Bourne (Bourne, POSIX, bash, ksh, zsh), kerang gaya C (csh, tcsh), dan bahkan pada ikan tanpa kawat gigi. Jadi ini sangat universal di antara shell unix. Saya tidak akan menyebut kawat gigi itu latihan yang bagus. Tapi saya benar-benar memanggil secara sistematis menggunakan tanda kutip ganda di sekitar substitusi variabel praktik yang baik.
Gilles 'SO- berhenti bersikap jahat'
1
@ Gilles, saya akan melangkah lebih jauh dan mengatakan daripada tidak menggunakan tanda kutip ganda di sekitar penggantian variabel adalah praktik yang sangat buruk .
Stéphane Chazelas
Juga, berhati-hatilah agar ${ }tidak terjadi penggabungan. Misalnya, ELP=elp && echo $ELP && man --h${EPL}tidak berfungsi.
foki
4

Hanya menyatukan isi variabel ke apa pun yang ingin Anda gabungkan, misalnya

/usr/bin/mysqldump --opt -u root --ppassword "$WEBSITE" > "$WEBSITE.sql"

Kutipan ganda tidak terkait dengan penggabungan: di sini >$WEBSITE.sqlakan bekerja juga. Mereka diperlukan sekitar ekspansi variabel ketika nilai variabel mungkin berisi beberapa karakter khusus shell (spasi dan \[?*). Saya sangat merekomendasikan menempatkan tanda kutip ganda di semua ekspansi variabel dan penggantian perintah, yaitu selalu menulis "$WEBSITE"dan"$(mycommand)" .

Untuk detail lebih lanjut, lihat $ VAR vs $ {VAR} dan untuk mengutip atau tidak mengutip .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Saya biasanya menggunakan tanda kutip, misalnya echo "$WEBSITE.sql".

Jadi Anda bisa menulis seperti:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"
Gert
sumber
3
Ini berfungsi karena .bukan karakter yang valid dalam nama variabel; lihat jawaban wag jika Anda ingin menyatukan string yang dimulai dengan karakter yang valid (mis. "$ WEBSITEsql" tidak akan berfungsi)
Michael Mrozek