変数を使用してタッチでファイルを作成する

変数を使用してタッチでファイルを作成する

この変数があります。

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

このstackoverflowの答えには良い説明があります。

答え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

関連情報