1

誰かがこのコードで私を説明できますか

 data=$(date +"%Y-%m-%dS%H:%M:%S")
 name="/home/cft/"$data"_test.tar"
 touch $name

動作し、新しい .tar ファイルを作成しますが、このコードは動作しません

 data=$(date +"%Y-%m-%dS%H:%M:%S")
 name= "/home/cft/"$data"_test.tar"
 touch $name

このエラーが表示されます:そのようなファイルまたはディレクトリはありませんか?

= と逆コンマの間のスペースでこのエラーが発生するのはなぜですか?

4

3 に答える 3

7

シェルでは、コマンドの前に 1 つ以上の変数割り当てを付けることで、コマンドごとの環境オーバーライドを提供できます。

name= "/home/cft/"$data"_test.tar"

環境内で値が空の文字列に設定された/home/cft/2013-10-08S12:00:00_test.tar(たとえば)という名前のプログラムを実行するようにシェルに要求します。name

(あなたの場合、指定されたtarファイルが存在しないか、存在する場合は実行可能ファイルではないため、エラーが発生します。)

変数の割り当ては、等号の後に空白がないことで識別されます。

(name = whateverもちろん、 はname2 つの文字列引数で=呼び出される単なるコマンドwhateverです。)

于 2013-10-08T15:22:36.143 に答える
2

BASH (および zsh や Kornshell などの他の Bourne タイプのシェル) では、変数を設定するときに等号の前後にスペースを入れることはできません。

良い:

$ foo="bar"

悪い:

$ foo= "bar"
$ foo = "bar"

スペースの使用を妨げる本当の理由はありません。他のプログラミング言語では、これに関して問題はありません。これは、シェル自体の構文にすぎません。

その理由は、シェルが空白に基づいてコマンド ラインを分割する元の Bourne シェル解析に関連している可能性があります。これによりfoo=bar、2 つまたは 3 つの代わりに 1 つのパラメーターが作成されます (等号の両側に空白があるか、または片側だけに空白があるかによって異なります)。シェルは=記号を見て、このパラメーターが代入であることを認識できます。

シェル パラメータの解析は、多くの点で非常に原始的です。空白は非常に重要です。応答性を高めるには、シェルを小さく高速にする必要があります。これは、複雑な行の解析などの不要なものを削除することを意味します。

逆コンマ 引用符のことだと思います。二重引用符は、空白によるパラメーターの分割をオーバーライドするために使用されます。

悪い:

$ foo=this is a test
bash: is: command not found

良い:

$ foo="this is a test"

二重引用符は補間を許可します。一重引用符は次のことを行いません。

$ foo="bar"
$ echo "The value of foo is $foo"
The value of foo is bar
$ echo 'The value of foo is $foo'
The value of foo is $foo.

一重引用符で始める場合は、二重引用符を中に入れることができます。一重引用符がある場合は、中に二重引用符を入れることができます。

$ foo="bar"
$ echo "The value of foo is '$foo'"
The value of foo is 'bar'
$ echo 'The value of foo is "$foo"'
The value of foo is "$foo"

これは、 unquote する必要がないことを意味します$data。ただし、アンダースコアは変数名で有効な文字であるため、中かっこで囲む必要があります。$dataしたがって、変数がであり、 ではないことをシェルが理解していることを確認する必要があります$data_backup

name="/home/cft/${data}_test.tar"
于 2013-10-08T15:38:27.517 に答える