Bir kabuk değişkenini komut satırlarımdaki diğer parametrelere nasıl birleştirebilirim?


16

Bir kabuk değişkenini komut satırlarımdaki diğer parametrelere nasıl birleştirebilirim?

Örneğin,

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

Birleştirmem .sqlgerekiyor$WEBSITE

Yanıtlar:


26

${ }Bir değişkeni kapatmak için kullanın .

Kıvırcık parantez olmadan:

VAR="foo"
echo $VAR
echo $VARbar

verirdi

foo

ve hiçbir şey, çünkü değişken $VARbarmevcut değil.

Kıvırcık parantez ile:

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

verirdi

foo
foobar

Birincisini kuşatmak $VARgerekli değildir, ancak iyi bir uygulamadır.

Örneğiniz için:

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

Bu çalışmalar bash, zsh, kshbelki diğerleri de.


3
Bu, tüm Bourne tarzı kabuklar (Bourne, POSIX, bash, ksh, zsh), C tarzı kabuklar (csh, tcsh) ve hatta diş teli olmayan balıklarda bile çalışır. Yani unix mermileri arasında gerçekten evrensel. Parantezlere iyi uygulama demezdim. Ama ben sistematik olarak değişken ikameler etrafında çift tırnak kullanarak iyi uygulama çağırıyorum.
Gilles 'SO- kötü olmayı bırak'

1
@Gilles, ben daha ileri gidip, daha söyleyebilirim değil ise değişken değiştirmelerin çift tırnak kullanarak çok kötü uygulama.
Stéphane Chazelas

Ayrıca, ${ }hiçbir anlamda birleştirme olmadığına dikkat edin . Örneğin, ELP=elp && echo $ELP && man --h${EPL}çalışmıyor.
foki

4

Değişken içeriğini birleştirmek istediğiniz başka bir şeyle birleştirin, ör.

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

Çift tırnak işaretleri birleştirme ile ilgisiz: burada >$WEBSITE.sql da işe yarardı. Değişkenin değeri bazı özel kabuk karakterleri (boşluk ve \[?*) içerebiliyorsa değişken genişletmeler etrafında bunlara ihtiyaç duyulur . Tüm değişken genişletmelerin ve komut ikamelerinin etrafına çift tırnak koymanızı şiddetle öneririm, yani her zaman yaz "$WEBSITE"ve "$(mycommand)".

Daha fazla ayrıntı için bkz. $ VAR vs $ {VAR} ve teklif vermek veya teklif etmemek .


2

Genellikle tırnak işareti kullanırım, ör. echo "$WEBSITE.sql" .

Yani şöyle yazabilirsiniz:

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

3
.Değişken adında geçerli bir karakter olmadığından bu işe yarar ; bkz Wag cevabını siz geçerli karakterlerle başlıyor bir dize bitiştirmek istiyorsanız (örneğin "$ WEBSITEsql" olmaz iş)
Michael Mrozek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.