查找和变量的问题

查找和变量的问题

我尝试了以下不同的变体,但似乎没有任何效果。基本上,当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 "$@"
}     

相关内容