shell編程中一個空格引起的異常,shell編程空格引起

來源:互聯網
上載者:User

shell編程中一個空格引起的異常,shell編程空格引起

  最近使用shell編寫一個備份和替換f伺服器程式的指令碼replace.sh,初衷是為了節約人力的重複機械的勞動。在指令碼編寫過程中,由於疏忽多打了一個空格,出現了一個不符合預期的情況。

1.先看一下出問題的replace.sh

 清單1:replace.sh

 1 #!/bin/sh 2 file="mv.sh"     #日誌清理指令碼 3 bak="mv" 4 replace="scp" 5 hostPath="/data/kuyin_new/musicsearch/bin/logs" 6 #hostList=(172.16.72.50 172.16.72.56 172.16.72.58 172.16.72.76 172.16.72.78 172.16.72.96 172.16.72.98) 7 hostList=(172.16.72.50) 8 for host in ${hostList[*]} 9 do10     bakCmd= "ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak"    #先備份目標機器上的指令碼,這裡=之後多打了一個空格11     echo $bakCmd       #這裡先列印一下bakCmd命令,看一下12     #bash -c "$bakCmd"13     #replaceCmd="$replace $file ${host}:${hostPath}"   #拷貝至目標機器14     #finalCmd="${bakCmd} & ${replaceCmd}"15     #echo $replaceCmd16     #echo $finalCmd17     #bash -c "$finalCmd"18 done

執行指令碼,運行結果如下:

  多打了一個空格,之後bash replace.sh運行指令碼,出現了不符合預期的情況:ssh 172.16.72.50 mv /data/kuyin_new/musicsearch/bin/logs/mv.sh /data/kuyin_new/musicsearch/bin/logs/mv.sh.bak(ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak經過變數替換後的結果) 命令竟然執行了!而我的初衷是用echo查看這個命令組合的是不是正確,這條命令並不會被執行。那麼為什麼會出現這種情況呢?

  為了找出問題,可以通過bash -x replace.sh運行指令碼。“-x”選項使shell在執行指令碼的過程中把它實際執行的每一個命令列顯示出來,並且在行首顯示一個"+"號。 "+"號後面顯示的是經過了變數替換之後的命令列的內容,有助於分析實際執行的是什麼命令。 “-x”選項使用起來簡單方便,可以輕鬆對付大多數的shell調試任務,應把其當作首選的調試手段。執行bash -x replace.sh,結果如下:

  

  可以看出,replace.sh中的第10行被拆成了2條命令(黃色框和紅色框共2條命令),因此ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak才會被執行。下面去掉第10行多出的空格,看一下效果。

2. 正常的replace.sh

  清單2:replace.sh

 1 #!/bin/sh 2 file="mv.sh"     #日誌清理指令碼 3 bak="mv" 4 replace="scp" 5 hostPath="/data/kuyin_new/musicsearch/bin/logs" 6 #hostList=(172.16.72.50 172.16.72.56 172.16.72.58 172.16.72.76 172.16.72.78 172.16.72.96 172.16.72.98) 7 hostList=(172.16.72.50) 8 for host in ${hostList[*]} 9 do10     bakCmd="ssh $host $bak ${hostPath}/$file ${hostPath}/${file}.bak"    ##先備份目標機器上的指令碼,去除了多餘的空格,此時第10行就是一個命令11     echo $bakCmd12     #bash -c "$bakCmd"13     #replaceCmd="$replace $file ${host}:${hostPath}"   #拷貝至目標機器14     #finalCmd="${bakCmd} & ${replaceCmd}"15     #echo $replaceCmd16     #echo $finalCmd17     #bash -c "$finalCmd"18 done

  運行結果如下:

  因此,在編寫shell指令碼時要格外注意空格。

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.