2011-07-19 22 views
2

這個問題已經有一些關係候選人已經被回答,並且我嘗試了幾種嘗試解決問題的方法。具體來說,我的情況是這樣的:從命令輸出中匹配子字符串

我有一個實用名稱的數組可能或可能不會安裝在Linux機器上(例如:ssh,sudo等),所以我試圖檢查該實用程序是否存在或者不是基於嘗試依次調用實用程序的結果。我試圖在bash中做到這一點。 Bash版本是在Ubuntu 10.10上運行的4.1.5(1),但計劃在BusyBox上部署。

如果該實用程序不存在,那麼通常會收到一條消息,指出「未找到」或包含該確切字符串。否則,你會收到一條使用信息。我已經嘗試了一些正則表達式來表示我使用的grep,但它沒有任何區別,這導致我相信我的代碼中存在更根本性的缺陷。

我完全知道有這樣做的實用程序,但對於我正在工作的環境,我無法訪問諸如dpkg之類的內容來檢查實用程序/程序包。總之,我打算部署這個環境的環境沒有包裝管理。

我有什麼大致是這樣的:

#!/bin/bash 
TOOLS=('ssh' 'soodo' 'dhclient' 'iperf') 
#list of tools is abridged for convenience and added 'soodo' as a sure miss 

#add a ridiculous option flag so don't accidentally trip any real flags 
if `echo ${TOOLS[0]} -222222 | grep -q "not found"`; then 
echo "${TOOLS[0]} is not installed." 
else echo `${TOOLS[0]} --version` 

#I am aware that --version is not applicable for all utilities, but this is just 
#for sake of example. 

我的問題是,如果從未似乎是準確的回升。如果我在它周圍標上「標記」,它可能會在if(如:soodo之類的程序會被聲稱存在,但ssh將被報告爲未安裝即使它已被安裝)時產生誤報或誤報, 。

如果你們需要進一步澄清我想要做的或類似的事情,請詢問。這是我能夠提供的最少的回報,以換取其他人的一些見解。

+0

您應該使用'which'而不是調用無效的命令。解析錯誤信息是一種壞習慣,因爲它旨在以自然語言幫助用戶。例如在法國系統上,您將永遠不會看到「找不到」字符串。 – Lynch

+0

不太確定「-222222」是一個荒謬的選擇。對於許多選項解析器,「-abcd」與「-a -b -c d」相同,所以「-222222」爲「-2 -2 -2 -2 -2 -2」。 ssh確實有一個有效的選項「-2」 –

回答

1

對於bash,type是確定命令是否是PATH中的程序,函數或別名的方法。

TOOLS=('ssh' 'soodo' 'dhclient' 'iperf') 
for tool in "${TOOLS[@]}"; do 
    if type -p "$tool" > /dev/null; then 
    echo "$tool is installed" 
    else 
    echo "$tool is not installed" 
    fi 
done 

在你在做什麼的錯誤:

if `echo ${TOOLS[0]} -222222 | grep -q "not found"`; then 

發生了什麼事有:

  • 第一,echo ${TOOLS[@]} -222222打印 「SSH -222222」 到stdout
  • 輸入grep -q "not found",它不輸出標準輸出
  • 反引號替換從管道輸出(一個空行,這始終是從grep -q輸出)到if命令,讓你獲得if <a newline> ; then

你會得到相同的結果if $(printf "\n"); then echo Y; else echo N; fi這是永遠是真的。

要做到你嘗試一下,你就必須寫:

if "${TOOLS[0]}" -222222 2>&1 | grep -q "not found"; then ... 

將執行管道,然後if將考慮退出狀態。退出狀態零被認爲是真實的,任何其他退出狀態都被認爲是錯誤的。

但是,不要這樣做以查明程序是否存在。

1
#!/bin/bash 
TOOLS=('ssh' 'soodo' 'dhclient' 'iperf') 
#list of tools is abridged for convenience and added 'soodo' as a sure miss 

for TOOL in ${TOOLS[@]} 
do 
    which $TOOL > /dev/null 
    RESULT=$? 
    if [ $RESULT -eq 0 ] 
    then 
    echo $TOOL is available 
    else 
    echo $TOOL is not available 
    fi 
done