641

test.shというスクリプトがあります。

#!/bin/bash
STR = "Hello World"
echo $STR

私が走るsh test.shと私はこれを手に入れます:

test.sh: line 2: STR: command not found

私は何が間違っているのですか?私はオンラインで非常に基本的な/初心者のbashスクリプトチュートリアルを見て、これが変数を宣言する方法です...だから私は何が間違っているのかわかりません。

私はUbuntuServer9.10を使用しています。はい、bashはにあり/bin/bashます。

4

5 に答える 5

1119

=看板の周りにスペースを入れることはできません。

あなたが書くとき:

STR = "foo"

bashはSTR、2つの引数(文字列=foo)で指定されたコマンドを実行しようとします

あなたが書くとき:

STR =foo

bashはSTR、1つの引数(文字列=foo)で指定されたコマンドを実行しようとします

あなたが書くとき:

STR= foo

bashはfoo、STRを環境内の空の文字列に設定してコマンドを実行しようとします。

これが明確にするのに役立つのか、それとも単なる難読化であるのかはわかりませんが、次の点に注意してください。

  1. STR "=" "foo"最初のコマンドは、: 、とまったく同じです。
  2. 2番目はと同じですSTR "=foo"
  3. 最後は。と同等STR="" fooです。

sh言語仕様の関連セクション、セクション2.9.1には、次のように記載されています。

「単純なコマンド」とは、オプションの変数の割り当てとリダイレクトのシーケンスであり、任意のシーケンスで、オプションで単語とリダイレクトが続き、制御オペレーターによって終了されます。

そのコンテキストでは、awordはbashが実行しようとしているコマンドです。リダイレクトではなく、前の文字列の部分が有効な変数名である=(文字列の先頭以外の位置にある)文字列を含む文字列は変数の割り当てですが、リダイレクトまたは=変数の割り当てはコマンドです。でSTR = "foo"STRは変数の割り当てではありません。

于 2010-02-15T18:34:40.900 に答える
182

=標識の周りのスペースを削除します。

#!/bin/bash 
STR="Hello World" 
echo $STR 
于 2010-02-15T18:34:40.643 に答える
8

インタラクティブモードでは、すべてが正常に見えます。

$ str="Hello World"
$ echo $str
Hello World

明らかに(!)ヨハネスが言ったように、周りにスペースはありません=。周囲にスペースがある場合=、インタラクティブモードでは次のようなエラーが発生します

コマンド'str'が見つかりません

于 2010-02-26T06:33:51.300 に答える
7

私はこれが非常に質の高い答えで答えられたことを知っています。しかし、要するに、あなたはスペースを持つことができません。

#!/bin/bash
STR = "Hello World"
echo $STR

等号の周りにスペースがあるため、機能しませんでした。あなたが走るなら...

#!/bin/bash
STR="Hello World"
echo $STR

それはうまくいくだろう

于 2019-03-27T12:58:52.643 に答える
4

変数を定義するときは、余分なスペースを入れる必要はありません。

例えば

name = "Stack Overflow"  
// it is not valid, you will get an error saying- "Command not found"

したがって、スペースを削除します。

name="Stack Overflow" 

そしてそれはうまくいくでしょう。

于 2017-06-19T15:16:22.880 に答える