2014-01-09 39 views
1

我想運行一個簡單的bash計時器,發現這個online(用戶brent7890)理解何時在bash腳本中使用空格

#!/usr/bin/bash 
timer=60 
until [ "$timer" = 0 ] 
do 
clear 
echo "$timer" 
timer=`expr $timer - 1` 
sleep 1 
done 
echo "-------Time to go home--------" 

我不能複製,因爲服務器是另一個網絡上粘貼此代碼。我輸入它像這樣(下面),並以「直到」開始的行上出現錯誤。

#!/usr/bin/bash 
timer=60 

#Note I forgot the space between [ and " 
until ["$timer" = 0 ] 

do 
clear 
echo "$timer" 
timer=`expr $timer - 1` 
sleep 1 
done 
echo "-------Time to go home--------" 

哪裏有間距這樣的記錄?這很重要。 Bash腳本可能會讓人困惑,我想了解爲什麼這個空間很重要。

+0

這個問題背後的混亂是許多風格指導推薦完全避免使用''的主要原因。直到[「$ $ $」= 0]',而不是'直到測試「$ timer」= 0',並且間距的需要變得明顯。 –

+0

與'['(aka'test')命令中需要的空格不同,它們在分配中被禁止。 'timer = 60'工作,但'timer = 60'會嘗試運行帶有參數「=」和「60」的'timer'命令。缺少空格實際上是shell如何區分常規命令和賦值。另外,'''命令中需要在運算符周圍使用空格:'[「$ timer」= 0]'是一個有效的'test'命令,但是它不符合你的期望,因爲它不能識別'=作爲一個操作員。 –

回答

6

有一些規則,兩個基本的是這些:

  • 你必須用空格分隔命令的所有參數。
  • 您必須用一個空格分隔命令和後面的參數。

[這裏是一個命令(test)。

如果你寫["$timer"這意味着你開始命令[60, 那是當然的,不正確的。該命令的名稱是[

該命令的名稱始終從與空間中的命令行的其餘部分分離。 (你可以有一個帶有空格的命令,但在這種情況下,你必須在""''中寫下該命令的名字)。

+0

OK,[是測試命令的同義詞。 http://stackoverflow.com/questions/8934012/when-square-brackets-are-required-in-bash-if-statement – user584583

+0

@ user584583:是的,當然。我寫過。 –