除外ファイルとインクルードファイル形式の拡張子をgrepに渡します。

除外ファイルとインクルードファイル形式の拡張子をgrepに渡します。

カンマを区切り文字として使用して、ファイル形式拡張の除外情報と埋め込み情報を含むbash関数に、コマンドライン引数として渡される2つの変数があります。

excl="el"
excl="el,htm"
incl="texi,org"

除外オプションと埋め込みオプションを使用exclして解析したいです。inclgrep

excl="el,htm"
incl="texi,org"
grep -hir --exclude=\*.{el,htm} --include=\*.{org,texi} "$@"

excl="el"
incl="texi,org"
grep -hir --exclude=\*.el --include=\*.{org,texi} "$@"

ベストアンサー1

個々の文字列を追跡するには配列を使用する必要があります。単一の文字列を使用して複数の値を保存すると、区切り文字を含むサフィックス(,vCVSやRCSファイルのサフィックスなど)を含むコードは使用できません。

exclude=( .el .htm )
include=( .texi .org )

opts=( -h -i -r )

for ext in "${exclude[@]}"; do
    opts+=( --exclude="*$ext" )
done
for ext in "${include[@]}"; do
    opts+=( --include="*$ext" )
done

grep "${opts[@]}" "$@"

これにより、ファイル名のサフィックスが2つの配列excludeに格納されますinclude。次に、2つの配列の要素を繰り返して、という3番目の配列に適切なオプションを追加しますopts。次に、の呼び出しで3番目の配列を使用しますgrep

たとえば、配列を拡張するときに使用される二重引用符は、"${opts[@]}"個々の配列要素が二重引用符で囲まれ、シェルで分割されたりワイルドカードを使用できなくなったりします。


関数として、包含および除外されたファイル名のサフィックスのリストを2つの別々の引数として使用します。

call_grep () {
    local -n include="$1"
    local -n exclude="$2"

    shift 2

    local opts=( -h -i -r )
    local ext

    for ext in "${exclude[@]}"; do
        opts+=( --exclude="*$ext" )
    done
    for ext in "${include[@]}"; do
        opts+=( --include="*$ext" )
    done
    
    grep "${opts[@]}" "$@"
}

スクリプトの主な部分:

excl=( .el .htm )
incl=( .texi .org )

call_grep incl excl more arguments here

call_grepこれは、2つの配列の名前を取得する関数を設定します。最初の配列は含めるファイル名のサフィックス配列、2番目の配列は除外するサフィックス配列です。関数はこれらの配列の名前を受け取り、それを使用して2つのローカル名参照変数を設定します。grepPass as-は3番目のパラメータで始まります。


繰り返しますが、実際のコマンドライン解析を使用すると、次のようになりますcall_grep

call_grep () {
        OPTIND=1

        local ext opt
        local opts=( -h -i -r )

        while getopts 'i:e:' opt; do
                case $opt in
                        i)
                                local -n include="$OPTARG"
                                for ext in "${include[@]}"; do
                                        opts+=( --include="*$ext" )
                                done
                                ;;
                        e)
                                local -n exclude="$OPTARG"
                                for ext in "${exclude[@]}"; do
                                        opts+=( --exclude="*$ext" )
                                done
                                ;;
                        *)
                                echo 'Error in option parsing' >&2
                                exit 1
                esac
        done

        shift "$(( OPTIND - 1 ))"

        grep "${opts[@]}" "$@"
}

これで、関数は1つと-i1つ-eの引数(両方ともオプション)を受け入れます。各オプションの引数は、含めるまたは除外するファイル名のサフィックスを含む配列の名前でなければなりません。

次のように使用できます。

excl=( .el .htm )
incl=( .texi .org )

call_grep -i incl -e excl -- more arguments here

--に直接渡す必要があるパラメータと関数のパラメータを分離するには、を使用する必要がありますgrep


grepシェルモードや長いオプションに言及せずに単に呼び出す方法だけが欲しい場合:

call_grep () {
        OPTIND=1

        while getopts 'i:e:' opt; do
                case $opt in
                        i)      opts+=( --include="*$OPTARG" ) ;;
                        e)      opts+=( --exclude="*$OPTARG" ) ;;
                        *)      echo 'error' >&2; exit 1
                esac
        done

        shift "$(( OPTIND - 1 ))"

        grep "${opts[@]}" "$@"
}

繰り返し使用して複数のサフィックスを含めることができ、-i suffix同様にサフィックスを除外することもできます。例えば、

call_grep -i .texi -e .el -e .htm -i .org -- other arguments for grep here

または

call_grep -i{.texi,.org} -e{.htm,.el} -- more here for grep

おすすめ記事