検索と変数に関する問題

検索と変数に関する問題

以下のさまざまなバリエーションを試してみましたが、何も機能しないようです。基本的に、が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'

シェルは が'*.txt'引用符で囲まれていると判断し、引用符を削除して、内容*.txtを に渡しますfind

関数内で

find -name "'$var'"

シェル$varは に展開します*.txt。展開は二重引用符内で行われたため、シェルは二重引用符を削除し、内容'*.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 "$@"
}     

関連情報