web-dev-qa-db-ja.com

Bash変数割り当てでコマンドが見つかりませんエラー

私はこのスクリプト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にあります。

455
Jake Wilson

=記号の前後にスペースを入れることはできません。

あなたが書くとき:

STR = "foo"

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

あなたが書くとき:

STR =foo

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

あなたが書くとき:

STR= foo

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

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

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

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

「単純なコマンド」とは、任意の順序での任意選択の変数割り当ておよび方向変更のシーケンスであり、その後に制御演算子によって終了する、任意選択で単語および方向変更が続く。

その意味で、Wordname__はbashが実行しようとしているコマンドです。リダイレクトではない=を含む(ストリングの先頭以外の位置にある)ストリングはすべて変数割り当てですが、リダイレクトではなく=を含まないストリングはコマンドです。 STR = "foo"では、STRname__は変数代入ではありません。

829
William Pursell

=サインの周りのスペースを削除します。

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

インタラクティブモードでは、すべてがうまく見えます

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

明らかに!ヨハネスが言ったように、「=」の前後にスペースはありません。 '='のまわりにスペースがある場合は対話モードでは `としてエラーを返します

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

5
Arkapravo

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

例えば。

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

だからスペースを削除します。

name="Stack Overflow" 

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

0
Ravi Solanki

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

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

等号の周りのスペースのためにうまくいきませんでした。走ったら….

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

うまくいくでしょう

0
Derek Haber