2010-06-29 67 views
1

我想運行一些shell命令,如果字符串不存在於文本文件中。如果我粘貼這行到命令行,如果給我一個錯誤。Shell命令 - 基於命令輸出的條件?

if [ $(cat textfile.txt | grep "search string") -eq "" ]; then; echo "some string"; fi; 

錯誤:

-bash: [: -eq: unary operator expected 

回答

5

如果使用[]進行比較,你需要使用=而不是-eq。你還需要一些報價。

if [ "$(cat textfile.txt | grep 'search string')" = "" ]; then; echo "some string"; fi; 

注意grep可以採取一個文件名作爲參數所以cat是不必要的。您也可以直接使用grep的返回值:如果未找到搜索字符串,則grep返回1。

if [ "$(grep 'search string' textfile.txt)" ]; then 
    echo "some string"; 
fi 

更緊湊的方式是使用邏輯和&&

grep "search string" textfile.txt && echo "some string" 
+0

您不必更改引號,這是完全有效的bash:'「$(cat textfile.txt | grep」搜索字符串「)」' – Tyilo 2012-03-28 18:14:43

1

grep命令將返回0,如果請求的線被發現(1如果沒有,2如果有錯誤),所以你可以只使用:

grep "search string" textfile.txt >/dev/null 2>&1 
if [[ $? -ne 0 ]] ; then 
    echo 'Not found' 
fi 

如果你真的想使用字符串(你可能不應該),你應該引用它們,這樣你就不會得到太多的參數[命令:

if [ "$(cat textfile.txt | grep 'search string')" == "" ] ; then 
    echo "It's not there!" 
fi 
+0

我沒有downvote,但你的回答是遠遠沒有達到最佳:有沒有必要做重定向,因爲'grep'有一個'-q'選項,Bash可以測試命令的返回值而不使用'$?'。 – Philipp 2010-06-29 08:09:18

+0

沒關係,Philipp。並非所有的greps都有這些選項(我仍然使用一些傳統的UNIX),我也不會爲了效率而使用shell腳本。我將在未來將你的答案納入我的(現代)腳本,因此+1。 – paxdiablo 2010-06-29 08:26:43

2
grep -F -q -e 'search string' textfile.txt || echo 'Not found' 

注:

  • -F防止搜索字符串爲正則表達式的解釋。
  • -q在找到第一個實例後立即取消所有輸出並立即返回,如果字符串出現在大文件的開始位置,則搜索速度會更快。
  • -e顯式指定模式,允許以短劃線開頭的模式。
  • 除非您想要變量替換,否則請使用單引號。
+0

優雅。某處沿線有人試圖將bash變成perl'[[$(''不幸。 – msw 2010-06-29 07:46:17

1

這種情況下不需要方括號。由於[實際上是一個命令,因此您可以在任何可以使用它的地方使用任何命令。所以在這裏,我們可以使用grep。沒有必要使用cat,因爲grep將接受文件名作爲參數。另外,你有兩個分號太多。

if grep -q "search string" textfile.txt; then echo "some string"; fi 

if grep "search string" textfile.txt > /dev/null 2>&1; then echo "some string"; fi