Як я можу з'єднати змінну оболонки з іншими параметрами в моїх командних рядках?


16

Як я можу з'єднати змінну оболонки з іншими параметрами в моїх командних рядках?

Наприклад,

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

Мені потрібно СЦЕПИТЬ .sqlдо$WEBSITE

Відповіді:


26

Використовуйте ${ }для закриття змінної.

Без фігурних дужок:

VAR="foo"
echo $VAR
echo $VARbar

дав би

foo

і нічого, тому що змінної $VARbarне існує.

З фігурними дужками:

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

дав би

foo
foobar

Закривати перше $VARне потрібно, але хороша практика.

Для вашого прикладу:

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

Це працює bash, zsh, ksh, можливо , інші теж.


3
Це працює для всіх раковин у стилі Борна (Bourne, POSIX, bash, ksh, zsh), раковин у стилі C (csh, tcsh) і навіть для риб без дужок. Так що він справді універсальний серед оболонок Unix. Я б не назвав брекети гарною практикою. Але я систематично називаю подвійні лапки навколо змінної заміни гарною практикою.
Жил "ТАК - перестань бути злим"

1
@Gilles, я б пішов далі і скажу, що не використовувати подвійні лапки навколо змінних підстановок - це дуже погана практика.
Стефан Шазелас

Також слідкуйте за тим, щоб ${ }це не було конкатенацією в жодному сенсі. Наприклад, ELP=elp && echo $ELP && man --h${EPL}не працює.
foki

4

Просто з'єднайте змінний вміст з тим, що ви хочете об'єднати, наприклад, наприклад

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

Подвійні лапки не мають відношення до конкатенації: тут >$WEBSITE.sqlтакож працювали б. Вони потрібні навколо змінних розширень, коли значення змінної може містити деякі спеціальні символи оболонки (пробіл та \[?*). Я настійно рекомендую ставити подвійні лапки навколо всіх змінних розширень та підстановок команд, тобто завжди писати "$WEBSITE"і "$(mycommand)".

Детальніше дивіться у розділі $ VAR проти $ {VAR} і цитувати чи не цитувати .


2

Я зазвичай використовую цитати, наприклад echo "$WEBSITE.sql".

Отже, ви можете написати це так:

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

3
Це працює, оскільки .не є дійсним символом в імені змінної; див . відповідь ваг, якщо ви хочете об'єднати рядок, який починається з дійсних символів (наприклад, "$ WEBSITEsql" не працює)
Майкл Мрозек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.