2015-08-13 26 views
0

我寫了我認爲是一個快速腳本,我可以在一堆機器上運行。相反,它打印的內容看起來可能是一個遞歸搜索目錄內容:bash:sed:意外的行爲:顯示所有內容

version=$(mysql Varnish -B --skip-column-names -e "SELECT value FROM sys_param WHERE param='PatchLevel'" | sed -n 's/^.*\([0-9]\.[0-9]*\).*$/\1/p') 
if [[ $(echo "if($version == 6.10) { print 1; } else { print 0; }" | bc) -eq 1 ]]; then 
    status=$(dpkg-query -l | awk '{print $2}' | grep 'sg-status-polling'); 
    cons=$(dpkg-query -l | awk '{print $2}' | grep 'sg-consolidated-poller'); 
    if [[ "$status" != "" && "$cons" != "" ]]; then 
     echo "about to change /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm"; echo; 
     cp /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm.bkup; 
     sed -ir '184s!\x91\x93!\x91\x27--timeout=35\x27\x93!' /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm; 
     sed -n 183,185p /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm; echo; 
    else 
     echo "packages not found. Assumed to be not applicable"; 
    fi 
else 
    echo "This is 4.$version, skipping"; 
fi 

的腳本應該確保光油是4.6.10版本,並有2個自定義.deb軟件包安裝(不通過apt-get的) 。然後做一個備份和編輯一個perl模塊中的單行從[]['--timeout=35']

它看起來像它在sed取代一個班輪絆倒。

+1

你的腳本有大量的外部依賴。請嘗試將其降至[最小完整可驗證示例](http://stackoverflow.com/help/mcve)。謝謝。 – tripleee

+0

此外,第一個「if」條件無可救藥地過於複雜,並且monkey-patching系統的Perl代碼看起來極其糟糕。 – tripleee

+0

if'打算說'如果[$ version == 6.10];然後 ...;其他...; fi'?我還建議使用'grep -q'來測試你的包的存在(如果沒有更正確的方法)。 –

回答

1

有兩個主要問題(評論中提到的小問題)。首先是您使用十進制代碼爲[]而不是六進制,所以您應該使用\x5b\x5d而不是\x91\x93。第二個問題是,如果使用正確的代碼,sed仍然會在語法上將它們解釋爲[]。所以你逃脫不了。這裏是你應該打電話:

sed -ri'.bkup' '184s!\[\]![\x27--timeout=35\x27]!' /var/www/Varnish/lib/Extra/SG/ObjectPoller2.pm 

這將爲你創建備份(但你應該仔細檢查)。