2010-02-15 85 views
364

我呼籲test.sh這個腳本:命令沒有找到錯誤的Bash變量賦值

#!/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

+21

我很高興你問了這個問題,你不是唯一的bash noob在那裏! –

+3

感謝您提出這個問題。這不是一個尷尬的問題。我在辦公室深夜工作,周圍沒有Bash專家來回答這個問題。 –

+1

現在(差不多七年後),有一個名爲[shellcheck](http://www.shellcheck.net)的FOSS linter /分析器可以自動檢測這個和其他常見的語法問題。它可以在線使用或脫機安裝並集成到您的編輯器中。 –

回答

704

你不能在你的 '=' 號的空間。

當你寫:

STR = "foo" 

bash會運行一個名爲STR命令以2個參數(字符串 '=' 和 '富')

當你寫:

STR =foo 

bash嘗試運行帶有1個參數的名爲STR的命令(字符串'= foo')

當你wr ite:

STR= foo 

bash嘗試運行foo命令,將STR設置爲其環境中的空字符串。

我不知道這是否有助於澄清或者如果它是單純的模糊,但是請注意:

  1. 的第一個命令是完全等價於:STR "=" "foo"
  2. 第二個是一樣的STR "=foo",
  3. ,最後等於STR="" foo

sh language spec, section 2.9.1狀態的相關部分:

A「簡單的命令」是可選的變量賦值和重定向的序列,以任何順序,任選地接着詞語和重定向,通過控制終止運營商。

在這種情況下,word是bash將要運行的命令。包含=的任何字符串(在除字符串開頭以外的任何位置)都不是重定向,而是任何非重定向並且不包含=的字符串是一個命令。在STR = "foo",STR不是一個變量賦值。

+0

如果你有一個名稱含有「 - 」的變量,同樣的錯誤發生。在這種情況下,解決方案是刪除「 - 」 – chomp

+0

chomp @ http://pubs.opengroup.org/onlinepubs/9699919799/的第2.10.10節的規則7b「如果前面的所有字符'='形成有效名稱(請參閱XBD名稱),則應返回令牌ASSIGNMENT_WORD。「在http://pubs.opengroup.org/onlinepubs/9699919799/的第3.231部分的鏈接之後,我們發現「在shell命令語言中,一個單詞只包含便攜字符集中的下劃線,數字和字母。第一個名字的性格不是數字。「所以「FOO-BAR = qux」這個詞不是一個變量賦值,因爲「FOO-BAR」不是一個有效的名字。 –

+1

我提供一個賞金獎勵這個清晰的解釋給初學者一個總是常見的問題(當然,也是爲了能夠更快地找到它,只要我想鏈接它:D)。感謝您讓事情變得簡單! – fedorqui

130

下降的空間周圍的=標誌:

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

這很有趣但是,因爲'set foo = bar'在Windows批處理文件中也是一個常見的錯誤 - 並且批處理語言被嘲笑;-) – Joey

+0

Thanks @joey。我被困在編寫一個shell腳本,我在「=」之後用空格初始化變量。你保存了我的一天 –

+0

爲什麼bash不接受左側字段中的數字?像3 =「Hello World」,它抱怨沒有找到命令 – Freedo

5

在交互模式中一切都看起來不錯

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

很明顯!正如Johannes所說,'='周圍沒有空格。如果周圍有「=」的任何空間,然後在交互模式下,它提供了錯誤的`

無命令「STR」發現

+1

但是請注意OP在說'STR =「Hello World」',所以這個答案在這裏不適用。 – fedorqui

+0

@Arkapravo交互模式的含義是什麼,它與'$'標記 –

+0

@KasunSiyambalapitiya通過「交互模式」有關,他意味着在實際終端中輸入這些命令,而不是腳本。 – numbermaniac

1

當你定義任何變量,那麼你就不必把在任何額外的空間。

E.g.

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

所以刪除空格:

name="Stack Overflow" 

,它會正常工作。