首頁 > 運維 > linux運維 > 主體

shell一個空格所造成的異常

大家讲道理
發布: 2017-05-28 10:30:13
原創
2286 人瀏覽過

  最近使用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腳本時要格外注意空格。

  

#

以上是shell一個空格所造成的異常的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!