この変数があります。
toto=123456
なぜtouch "$toto.hihi.log"
動作し、次のファイルを生成するのですか?123456.hihi.log
しかし、touch "$totohihi.log"
何も起こりませんでしたか?
答え1
あなたはする必要があります
touch "${toto}hihi.log"
問題は、中かっこがなければ、シェルが変数名に何文字があるかを知ることができないことです。したがって、すべての有効な文字を名前の一部と見なします。この場合は、以前のすべてです.
。つまり、シェルは存在しない変数を使用します$totohihi
。
通常、シェルオプションを使用して何が起こっているのかを判断するのに-x
役立ちます。
set -x
touch "$totohihi.log"
+ touch .log
答え2
はい。$totohihi
空の文字列に展開され、実行されますtouch ".log"
(変数が他の場所に設定されていないと仮定)。ls -l .log
何を言うのか見てみてください。
他の回答で述べたように、次の文字が変数名の一部である可能性がある場合は、変数名を中括弧で囲む必要があるため、変数名touch "${toto}hihi.log"
の文字と数字でアンダースコアも有効であるため、中"${toto}_hihi.log"
括弧も必要です。
答え3
$totohihi.log
名前のある変数を表します。totohihi
機能させるには、以下を使用してください。
${toto}hihi.log
答え4
シェルは、これが$toto
値が123456
.の変数であることを知っています。
したがって、見つけるたび$toto
にに置き換えます123456
。
そのため、$toto.hihi.log
シェルはasを接続演算子に置き換えて、$toto
期待どおりにファイルを生成します。 123456
.
ただし、$totohihi.log
シェルは名前付き変数を見つけることができないため、空の$totohihi
文字列に置き換えてファイルを生成します.log
。起動するファイルls -a
や隠しファイルなので、単純なコマンドを使用して表示できないファイルがある可能性があります。 ls .log
.
ls
nameというファイルを生成する必要がある場合は、123456hihi.log
他の人が前の回答で述べたように中$toto
括弧を入れる必要があります。${toto}hihi.log