Bash変数の割り当てでコマンドが見つからないというエラー


521

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

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

私が実行するsh test.shと、これが得られます:

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

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

私はUbuntu Server 9.10を使用しています。そして、はい、bashはにあり/bin/bashます。


49
あなたが質問をしてくれてうれしいです、あなたはそこにいる唯一のbash noobではありません!
ゴリラを製粉する

6
その質問をしてくれてありがとう。これは恥ずかしい質問ではありません。私はオフィスで深夜働いています。これに答えるBashの専門家はいません。
Adway Lele

3
最近(ほぼ7年後!)、これと他の一般的な構文の問題を自動検出するshellcheckと呼ばれるFOSSリンター/アナライザーがあります。オンラインで使用することも、オフラインでインストールしてエディターに統合することもできます。
他の男、


使用することをお勧めします:この回答のために自分が入っていることが確実でない限り#!/usr/bin/env bash、直接置く代わりに:stackoverflow.com/a/21613044/3589567#!/bin/bashbash/bin
Alejandro Blasco

回答:


929

「=」記号の前後にスペースを含めることはできません。

あなたが書くとき:

STR = "foo"

bashは2つの引数(文字列 '='と 'foo')でSTRというコマンドを実行しようとします

あなたが書くとき:

STR =foo

bashは1つの引数(文字列 '= foo')でSTRという名前のコマンドを実行しようとします

あなたが書くとき:

STR= foo

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

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

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

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

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

そのコンテキストでは、a wordはbashが実行するコマンドです。=リダイレクトではない(文字列の先頭以外の任意の位置に)を含む文字列は変数の割り当てですが、リダイレクトではなく、含まれていない文字列=はコマンドです。ではSTR = "foo"STRは変数の割り当てではありません。


2
"-"を含む名前の変数がある場合、同じエラーが発生します。「 - 」その場合、溶液を除去することである
CHOMP

1
セクション2.10.10のルール7bに@ムシャムシャ食べるpubs.opengroup.org/onlinepubs/9699919799「有効な名前を形成する前の『=』すべての文字の場合(XBD名を参照)、トークンASSIGNMENT_WORDが返されなければなりません。」セクション3.231へのリンクに続きpubs.opengroup.org/onlinepubs/9699919799することは、我々は、シェルコマンド言語では、ポータブル文字セットのみからアンダースコア、数字、アルファベットからなる単語が。名前の最初の文字が」見つけます数字ではない。」したがって、FOO-BAR=quxFOO-BAR有効な名前ではないため、この単語は変数の割り当てではありません。
ウィリアムパーセル

2
私は、初心者にとって常によくある問題にこの明確な説明を報いる報奨金を提供しています(まあ、また、リンクしたいときはいつでもそれをより早く見つけられるようにしています:D)。これを簡単にしてくれてありがとう!
fedorqui 'SO stop harming'

1
@fedorquiありがとう!これが明確な説明であると私は完全に確信しているわけではありません。
ウィリアムパーセル

159

=標識の周りのスペースをドロップします。

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

9
ただし、これはおかしいですが、set foo = barWindowsバッチファイルでよくある間違いであり、バッチ言語はそれのためにばかげています;-)
Joey

@joeyに感謝します。「=」の後にスペースを入れて変数を初期化するシェルスクリプトを作成するのに行き詰まりました。あなたは私の日を救った
ラリットラオ

なぜbashは左側のフィールドの数字を受け付けないのですか?3 = "Hello World"のように、コマンドが見つからないという文句を言う
Freedo

6

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

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

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

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


2
しかし、OPが言っていたことに注意してSTR = "Hello World"ください。したがって、この回答はここでは適用されません。
fedorqui 'SO stop harming'

@Arkapravoインタラクティブモードの意味は何ですか、それは$マークと関係があります
Kasun Siyambalapitiya

「対話型モード」による@KasunSiyambalapitiya彼は、スクリプトではなく実際の端末でこれらのコマンドを入力することを意味します。
numbermaniac 2017年

5

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

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

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

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

うまくいく


2

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

例えば

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

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

name="Stack Overflow" 

そしてそれはうまくいきます。

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