2016-02-09 37 views
1

尋找一種方法來擴展glob,如果我的參數在bash腳本中沒有被滿足,我並不積極,但我認爲它可能需要eval或類似的東西,但我記不起我的頭頂。以編程方式將glob添加到bash命令

功能

function search() 
{ 
    [ 'x' == "${2}x" ] && { 
    what="*" 
    } || { 
    what="${2}" 
    } 

    grep -n -Iir "${1}" "${what}" 
} 

沒有ARG2預期結果

grep -n -Iir 'something' * ## ran as the normal command 
+2

kibitzing的一點 - 在'function'關鍵字是一個bashism,使你的代碼不符合POSIX sh的同時增加了沒有價值超過POSIX標準的函數聲明語法 –

+0

...同時,'=='在POSIX測試中無效,對此,標準字符串比較運算符爲'='。 「[」x「=」x $ foo「]'成語,順便說一句,正確使用測試(適當的引用,不使用不推薦的'-a'和'-o'邏輯運算符等) 。 –

+0

順便說一句,原代碼與'grep -n -Iir'something''*''具有相同的結果;引用glob會阻止它的擴展。通常這就是你想要的 - 如果你*沒有引用'$ what'的擴展,那麼你的函數不能用空格搜索文件名。 –

回答

5

請記住,一個*由外殼grep之前擴展到文件名列表開始。因此,可以擴大這些自己:

search() { 
    local tgt=$1; shift  # move first argument into local variable tgt 
    (("$#")) || set -- * # if no other arguments exist, replace the remaining argument 
          # ...list with filenames in the current directory. 
    grep -n -Iir "$tgt" "[email protected]" # pass full list of arguments through to grep 
} 
+0

哇,再加上一個接受的,謝謝你的驚人的快速響應 – ehime

+0

另外,沒有必要在'(())中引用擴展。 「就像我在這裏做的一樣;這完全是爲了StackOverflow的語法高亮引擎的好處而完成的。 –

0

你有語法問題:你想$2被引用,但如果它是*。其結果是,你只是想兩個命令:

search() { 
    if [ -z "$2" ]; then 
     grep -n -Iir "$1" * 
    else 
     grep -n -Iir "$1" "$2" 
    fi 
} 
+2

我假設OP實際上需要任何額外的參數,而不是讓'search foo bar baz'忽略'baz',或者'search foo * .txt'忽略除第一個文本文件外的所有參數匹配glob。是的,他們的原始代碼會有這個錯誤,但這並不一定是正確的。 –

相關問題