Jak mogę połączyć zmienną powłoki z innymi parametrami w moich wierszach poleceń?

16

Jak mogę połączyć zmienną powłoki z innymi parametrami w moich wierszach poleceń?

Na przykład,

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

Muszę do łączenia .sqlz$WEBSITE

aneuryzm
źródło

Odpowiedzi:

26

Służy ${ }do zamykania zmiennej.

Bez nawiasów klamrowych:

VAR="foo"
echo $VAR
echo $VARbar

dałbym

foo

i nic, ponieważ zmienna $VARbarnie istnieje.

Z nawiasami klamrowymi:

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

dałbym

foo
foobar

Załączenie pierwszego $VARnie jest konieczne, ale jest dobrą praktyką.

Na przykład:

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

Działa to bash, zsh, ksh, może inni też.

machać
źródło
3
Działa to dla wszystkich skorup typu Bourne'a (Bourne, POSIX, bash, ksh, zsh), skorup typu C (csh, tcsh), a nawet u ryb bez nawiasów klamrowych. Jest więc naprawdę uniwersalny wśród powłok unixowych. Nie nazwałbym aparatów ortodontycznych dobrą praktyką. Ale dzwonię systematycznie, używając podwójnych cudzysłowów wokół dobrych praktyk podstawienia zmiennych
Gilles „SO- przestań być zły”
1
@Gilles, poszedłbym dalej i powiedziałbym, że nie stosowanie podwójnych cudzysłowów wokół podstawień zmiennych jest bardzo złą praktyką.
Stéphane Chazelas
Uważaj też, aby ${ }w żadnym sensie nie była to konkatenacja. Na przykład ELP=elp && echo $ELP && man --h${EPL}nie działa.
foki,
4

Po prostu połącz zmienną zawartość z czymkolwiek, co chcesz połączyć, np

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

Podwójne cytaty nie mają związku z konkatenacją: tutaj też >$WEBSITE.sqlby to działało. Są one potrzebne wokół rozszerzeń zmiennych, gdy wartość zmiennej może zawierać niektóre znaki specjalne powłoki (białe znaki i \[?*). Zdecydowanie zalecam umieszczanie podwójnych cudzysłowów wokół wszystkich rozszerzeń zmiennych i podstawień poleceń, tj. Zawsze pisz "$WEBSITE"i "$(mycommand)".

Aby uzyskać więcej informacji, zobacz $ VAR vs $ {VAR} i cytować lub nie cytować .

Gilles „SO- przestań być zły”
źródło
2

Zazwyczaj używam cytatów, np echo "$WEBSITE.sql".

Możesz więc napisać to tak:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"
Gert
źródło
3
Działa to, ponieważ .nie jest poprawnym znakiem w nazwie zmiennej; zobacz odpowiedź wag, jeśli chcesz połączyć łańcuch zaczynający się od prawidłowych znaków (np. „$ WEBSITEsql” nie zadziała)
Michael Mrozek