如何在命令行中将shell变量连接到其他参数?


16

如何在命令行中将shell变量连接到其他参数?

例如,

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

我需要连接.sql$WEBSITE

Answers:


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

这适用于bashzshksh,也许其他人了。


3
这适用于所有Bourne样式的壳(Bourne,POSIX,bash,ksh,zsh),C样式的壳(csh,tcsh),甚至在没有括号的鱼中也是如此。因此,它在unix shell中非常普遍。我不会将花括号称为良好做法。但是我确实系统地将变量替换周围的双引号称为优良作法。
吉尔(Gilles)“所以,别再邪恶了”,

1
@Gilles,我会进一步说,而不是在变量替换周围使用双引号是非常 不好的做法。
斯特凡Chazelas

另外,请注意${ }不要在任何意义上都是串联的。例如,ELP=elp && echo $ELP && man --h${EPL}不起作用。
foki

4

只需将变量内容连接到您想要连接的其他任何内容,例如

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

双引号与串联无关:这里>$WEBSITE.sql也可以使用。当变量的值可能包含一些shell特殊字符(空格和\[?*)时,就需要在变量扩展周围使用它们。我强烈建议在所有变量扩展和命令替换周围加上双引号,即始终写入"$WEBSITE""$(mycommand)"

有关更多详细信息,请参见$ VAR与$ {VAR}并引用或不引用


2

我通常使用引号,例如echo "$WEBSITE.sql"

所以你可以这样写:

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

3
这确实有效,因为.它不是变量名中的有效字符。如果要连接以有效字符开头的字符串(例如,“ $ WEBSITEsql”无效),请参见wag的答案
Michael Mrozek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.