シェルでの変数補間


103

という変数がありますfilepath=/tmp/name

変数にアクセスするために、私はこれを行うことができることを知っています: $filepath

私のシェルスクリプトで私はこのようなことをやろうとしました(バッククォートが意図されています)

`tail -1 $filepath_newstap.sh`

変数が呼び出されていないため、この行は失敗しました、そうです! $filepath_newstap.sh

_newstap.sh変数名に追加するにはどうすればよいですか?

バックティックは式の評価を目的としていることに注意してください。

回答:


186

使用する

"$filepath"_newstap.sh

または

${filepath}_newstap.sh

または

$filepath\_newstap.sh

_識別子の有効な文字です。ドットはそうではないので、シェルは補間しようとしました$filepath_newstap

を使用set -uして、未定義の変数を参照するときに、シェルをエラーで終了させることができます。


7
またset -u、未定義の変数を参照した場合にスクリプトが異常終了する原因についても触れているかもしれません。
Tripleee 2013

1
使用${}と二重引用符の違いは何ですか?どちらを優先するべきですか?
user31389

3
@ user31389:違いは、変数に空白が含まれる場合で、二重引用符のみが機能します。
チョロバ2018年

@choroba変数または変数
ジョシュアピンター

15

変数名を中括弧で囲みます。

`tail -1 ${filepath}_newstap.sh`

1
二重引用符は必要ありませんか?
michaelsnowden、2015年

@michaelsnowden必ずしもそうではありません。安全のために、はい。しかし、質問はスペースのないパスを明示的に述べ、問題は意図したものではなく、問題を解決するもの$filepath_newstap.shとして解釈されていることを示唆しました。${filepath_newstap}.sh${filepath}_newstap.sh

@michaelsnowdenそれは私がまだ気付いていないことを教えてくれます。なぜ二重引用符が必要だと思いますか?

あなたは文字列の補間を行おうとしているので、そのためには二重引用符が必要です
michaelsnowden

@michaelsnowdenパラメータの展開は、二重引用符内または完全に引用符外で行われます。パラメータの展開を防ぐ唯一の方法は、一重引用符、または引用符で区切られた文字、または識別子で無効な他の文字を区切ることです。たとえば、"$filepath"_foo${filepath}_fooの両方に拡大します/tmp/name_foo。しかし、'$filepath'_foo"$"filepath_foo、および$"filepath"_fooすべての完全展開を避けるだろう。これが、環境変数に(パラメーター展開の対象となる)export PATH=$PATH:$addpath追加するように機能する理由です。:$addpathPATH

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.