尋找和變數的問題

尋找和變數的問題

我嘗試了以下不同的變體,但似乎沒有任何效果。基本上,當find執行時似乎什麼也沒有發生。下面我展示了我的 bash 函數程式碼和運行它時的輸出。

我有興趣了解下面的程式碼會發生什麼,以及為什麼它的行為與我明確鍵入命令時不同。

另外,我還被告知我將無法存取rgrep我將要處理的某些盒子,因此我嘗試使用這種方法來獲取 grep 程式碼等的通用解決方案。

function findin() {

if [ -z $1 ] ; then

    echo "Usage: findin <file pattern> <<grep arguments>>"
    return 1

fi

fIn[1]=$1

shift
fIn[2]="$@"

echo -- "${fIn[1]}"
echo -- "'${fIn[2]}'"

find -type f -name "'${fIn[1]}'" -print0 | xargs -0 grep --color=auto ${fIn[2]}
}

輸出是:

$ ls
Server.tcl  Server.tcl~  test.cfg  vimLearning.txt
$ find -type f -name '*.txt' -print0 | xargs -0 grep --color=auto char
x      deletes char under cursor. NNx deletes NN chars to RHS of cursor.
r      type r and the next char you type will replace the char under the cursor.
$ findin '*.txt' char
-- *.txt
-- 'char'

答案1

您可能打算使用的模式是*.txt,但您告訴find -name要使用'*.txt',包括單引號,它與任何文件都不符。擴充的工作原理如下:

在命令列上,當你輸入

$ find -name '*.txt'

你的 shell 看到'*.txt'被引用了,所以它會去掉引號並將內容 , 傳遞*.txtfind

在函數中,

find -name "'$var'"

外殼擴展$var*.txt.由於擴展發生在雙引號內,因此 shell 會移除雙引號並將內容 , 傳遞'*.txt'find

解決方案很簡單:刪除 中的單引號find -name "'$var'"


我為你修改了你的功能:

findin () {
    if (( $# < 2 )); then
        >&2 echo "Usage: findin <file pattern> <grep arguments ...>"
        return 1    
    fi               
    pattern=$1               
    shift
    printf '%s\n' "-- ${pattern}"
    printf '%s ' "-- $@"
    echo
    find -type f -name "${pattern}" -print0 | 
            xargs -0 grep --color=auto "$@"
}     

相關內容