2013-05-09 203 views
5

下面的腳本輸出爲空。它缺少什麼?我想用grep一個字符串shell腳本grep grep一個字符串

#!/bin/ksh  
file=$abc_def_APP_13.4.5.2  
if grep -q abc_def_APP $file; then 
echo "File Found" 
else 
echo "File not Found" 
fi 
+2

爲什麼#!行說ksh? – jman 2013-05-09 18:09:16

+1

'file'應該是什麼值?我懷疑你可能在該作業的RHS上存在問題。 – chepner 2013-05-09 18:14:07

回答

9

bash,使用<<<重定向從一個字符串('Here string'):

if grep -q abc_def_APP <<< $file 

在其他炮彈,你可能需要使用:

if echo $file | grep -q abc_def_APP 

我把我的then放在下一行;如果你想讓你的then在同一行上,然後在我寫的東西之後加上; then


需要注意的是這個任務:

file=$abc_def_APP_13.4.5.2 

是非常奇怪的;它採用環境變量${abc_def_APP_13}的值並在末尾添加.4.5.2(由於我們可以看到腳本的開始,它必須是env var)。你可能打算寫:

file=abc_def_APP_13.4.5.2 

在一般情況下,你應該附上持有的文件名用雙引號變量的引用,以避免在文件名中的空格等問題。這裏並不重要,但最佳做法是良好做法:

if grep -q abc_def_APP <<< "$file" 
if echo "$file" | grep -q abc_def_APP 
+0

如果我使用'if echo $ file | grep -q abc_def_APP這是打印$文件的內容,我不想 – Jill448 2013-05-09 18:12:15

+0

您選擇了'-q'選項使'grep'以'quiet'模式運行(每個[POSIX](http:// pubs .opengroup.org/onlinepubs/9699919799 /公用事業/ grep.html));它不應該輸出任何東西。如果你的'grep'版本對'-q'有不同的理解,你必須看看你的man'grep'的手冊頁,或者重定向到'/ dev/null'。 – 2013-05-09 18:16:13

+0

第一個人工作。 '如果grep -q abc_def_APP <<< $文件' – Jill448 2013-05-09 18:17:06

3

Yu!使用外殼的字符串匹配

if [[ "$file" == *abc_def_APP* ]]; then ... 
+0

你不用冒着與'* abc_def_APP *'匹配多個文件的風險並且破壞了這個過程中的條件嗎?如果'$ file'爲'abc_def_APP1'且'* abc_def_APP *'擴展爲'abc_def_APP1 abc_def_APP2',那麼該條件將被評估爲false。 – Anthony 2014-11-01 13:08:22

+0

和關於「Yuck!」部分我完全同意你的看法!整個unix(unix-like)命令外殼令人噁心......但你不能沒有它,你能嗎? – Anthony 2014-11-01 13:14:02

+0

在雙括號內,我們模式匹配左側字符串,不匹配文件名。 – 2014-11-02 02:32:30