2017-04-10 120 views
1

我想在bash腳本一個case語句來初始化變量,的bash腳本的情況下開關

function cpfiles(){ 
case $1 in 
     a) echo "a" ; source = ${HOME}/dev/a.zip ; dest = 'PROGRA~2\\a.zip';; 
     b) echo "b" ; source = ${HOME}/dev/b.zip ; dest = PROGRA~2\\b.zip;; 
     *) echo "INVALID MODULE !" ;; 
esac 

echo ${source} ${dest} 
} 

,但我收到此錯誤:

[#] cpfiles a 
a 
bash: =: No such file or directory 
bash: dest: command not found... 

我缺少什麼?

+0

除的答案,我會檢查在B報價)dest後= – Michal

回答

2

你的腳本包含以下:

a) echo "a" ; source = ${HOME}/dev/a.zip ; dest = 'PROGRA~2\\a.zip';; 
b) echo "b" ; source = ${HOME}/dev/b.zip ; dest = PROGRA~2\\b.zip;; 

問題:

  • source是內置
  • 殼你之前和=符號後添加多餘的空格。您可能會發現更容易閱讀,但它不是有效的shell語法。

因此,而不是將值分配給一個名爲source變量時,實際上是調用source內建命令,傳遞=作爲參數。

試試這個:

a) echo "a" ; source=$HOME/dev/a.zip ; dest='PROGRA~2\a.zip';; 
b) echo "b" ; source=$HOME/dev/b.zip ; dest='PROGRA~2\b.zip';; 

請注意,周圍HOME括號,而完全有效的,沒有必要的,因爲沒有歧義其中變量名結束(/不是一個變量名有效,所以shell在解析時停在那裏)。雙引號將被大多數人在分配上使用,但是當分配的字符串不包含空格時(即使其擴展值確實存在),它也不是必需的。

最後一個問題......在其中一種情況下,您將單引號分配的值爲dest,並且還要轉義反斜槓。這將產生一個包含兩個反斜槓的值,我認爲這不是你想要的。刪除引號或其中一個反斜槓。

+0

謝謝, 當我刪除所有工作的空間,非常有幫助 – Breakidi

1

在shell中的賦值不需要圍繞=留空白。 某些命令期望單個=作爲參數是完全有效的。

你得到=: No such file or directory因爲source是,試圖打開該文件名爲shell命令:

source: source filename [arguments] 
    Execute commands from a file in the current shell. 

dest: command not found因爲後者的一部分被作爲運行命令dest

1

空格在bash中很重要,用於分隔參數;設置一個變量

source=${HOME}/dev/a.zip 

source是一個命令下面的命令試圖打開該文件=不存在

source = ... 
0

兩件事情在你的腳本重要的這是造成錯誤:

1.來源:它是一個shell變量,可用於將任何函數文件加載到當前shell腳本或命令提示符中。 它從給定的FILENAME讀取和執行命令並返回。

2.「=」在Unix中a = b沒有空格被視爲賦值運算符,a = b用於比較兩個字符串或者您可以像[[$ str1 == $ str2]一樣檢查條件語句。這是字符串相等性檢查的另一種方法。

此外,$ HOME將足以獲取變量的值而不是$ {HOME},但如果使用它,則不會發生任何錯誤。請參閱下面的上下文。

* $回聲$ {SHELL}

/斌/慶典

$回聲$ SHELL

/斌/慶典*