コマンドラインでシェル変数を他のパラメーターに連結するにはどうすればよいですか?


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

これはのために働くbashzshkshあまりにも、多分他の人を。


3
これは、すべてのBourneスタイルのシェル(Bourne、POSIX、bash、ksh、zsh)、Cスタイルのシェル(csh、tcsh)、およびブレースのない魚でも機能します。したがって、Unixシェル間では本当に普遍的です。中かっこを良い方法とは呼びません。しかし、変数置換の周りに二重引用符を使用して体系的に呼び出すことをお勧めします。
ジル 'SO-悪である停止

1
@Gilles、私はさらに進んで、変数置換の周りに二重引用符を使用しないことは非常に 悪い習慣だと言います。
ステファンシャゼラス16

また、${ }いかなる意味でも連結ではないことに注意してください。たとえば、ELP=elp && echo $ELP && man --h${EPL}機能しません。
フォキ

4

変数の内容を連結したいものに連結するだけです。例えば

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

二重引用符は連結とは無関係>$WEBSITE.sqlです。ここでも機能します。変数の値にシェルの特殊文字(空白および\[?*)が含まれる可能性がある場合、変数の展開に必要です。すべての変数展開とコマンド置換を二重引用符で囲むことを強くお勧めします。つまり、常に"$WEBSITE"andを記述し"$(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"は機能しません)
Michael Mrozek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.