2016-10-08 44 views
0

我有這段代碼,那應該調用reload如果當前文件($1)改變:無法在bash中檢查校驗和---顯然,語法錯誤?

thehash="`cksum $1`" 

while true 
do 
    curhash="`cksum $1`" 
    if "$curhash" -ne "$thehash"; then 
     reload 
    fi 
    ... 
done 

TL;博士:這是行不通的。

因爲我對bash不是很有經驗,所以我無法弄清楚我做錯了什麼。我得到這個錯誤:

58003725 834183 main.pdf: command not found 

顯然,bash將試圖執行curhash?我該如何解決?

+0

不知道什麼是錯的,但你可以通過使用此語法'thehash = $(校驗和「$ 1」)'代替''thehash =「'校驗和$ 1'」''啓動.. – Sundeep

+0

請參閱http://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters/131767#131767和http:// mywiki.wooledge.org/BashFAQ/082 – Sundeep

回答

3

你需要在你的條件括號if或使用test命令,所以它應該是

if [[ "$curhash" != "$thehash" ]]; then 

,並注意-ne是整數比較,!=是字符串比較

沒有[[test該變量被擴展並且變成要運行的命令,這就是爲什麼它試圖執行cksum的輸出:curhash的內容被視爲命令。

另外,正如@Sundeep提到的,獲取子shell輸出的更常用的首選方法是使用$(...)而不是反引號。 here是一個很好的答案談論

+0

哦!我試過使用括號,但他們沒有幫助;我沒有注意,也沒有注意到它們被空格隔開了! Bash是複雜的...無論如何,非常感謝你! – Akiiino

+1

@Akiiino http://www.shellcheck.net/是非常有用的,不要忘記引用你的變量......例如:''$ 1「' – Sundeep

+0

@Akiiino白色空間在bash中通常很重要,這就是它用來標記(又名,分詞) –