Как я могу объединить переменную оболочки с другими параметрами в моих командных строках?


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
@ Жиль, я бы пошел дальше и сказал, что не использовать двойные кавычки вокруг переменных - это очень плохая практика.
Стефан Шазелас

Кроме того, позаботьтесь о том, чтобы ${ }это не было объединением ни в каком смысле. Например, ELP=elp && echo $ELP && man --h${EPL}не работает.
Фоки

4

Просто объедините содержимое переменной с тем, что вы хотите объединить, например,

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

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

Для получения более подробной информации, смотрите $ VAR vs $ {VAR} и чтобы цитировать или не цитировать .


2

Я обычно использую цитаты, например echo "$WEBSITE.sql".

Так что вы можете написать это так:

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

3
Это работает, так .как не является допустимым символом в имени переменной; см . ответ wag, если вы хотите объединить строку, которая начинается с допустимых символов (например, «$ WEBSITEsql» не сработает)
Майкл Мрозек
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.