這個問題已經有一些關係候選人已經被回答,並且我嘗試了幾種嘗試解決問題的方法。具體來說,我的情況是這樣的:從命令輸出中匹配子字符串
我有一個實用名稱的數組可能或可能不會安裝在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將被報告爲未安裝即使它已被安裝)時產生誤報或誤報, 。
如果你們需要進一步澄清我想要做的或類似的事情,請詢問。這是我能夠提供的最少的回報,以換取其他人的一些見解。
您應該使用'which'而不是調用無效的命令。解析錯誤信息是一種壞習慣,因爲它旨在以自然語言幫助用戶。例如在法國系統上,您將永遠不會看到「找不到」字符串。 – Lynch
不太確定「-222222」是一個荒謬的選擇。對於許多選項解析器,「-abcd」與「-a -b -c d」相同,所以「-222222」爲「-2 -2 -2 -2 -2 -2」。 ssh確實有一個有效的選項「-2」 –