0

ヒアドキュメントを使用してテキスト ファイルを 1 つのファイルに結合する bundle という名前のスクリプトがあります。バンドル スクリプトを呼び出すときに名前が引数として渡されるファイルは、1 つのファイル (ここでは filebundle という名前) 内に配置されます。このファイルを bash スクリプトとして実行すると、ファイルを個別のファイルにバンドル解除できます。

バンドル スクリプトは次のとおりです。

#! /bin/bash
# bundle: group files into distribution package.

echo "# To unbundle, bash this file."

for i
do 
    echo "echo $i 1>&2"
    echo "cat >$i <<'End of $i'"
    cat $i
    echo "End of $i"
done

これは、次のように実行すると

$ bash bundle file1.txt file2.txt > filebundle

filebundle という名前の次のファイルが生成されます。

# To unbundle, bash this file.
echo file1.txt 1>&2
cat >file1.txt <<'End of file1.txt'
This is file1.
End of file1.txt
echo file2.txt 1>&2
cat >file2.txt <<'End of file2.txt'
This is file2.
End of file2.txt

私が言ったように、これはファイル1.txtとファイル2.txtの両方をアンバンドルするためにbashすることができます

私の質問は次のとおりです。バンドル スクリプトを書き直して、ファイルバンドル ファイルの結果として、ファイル名を引数として使用してもしなくても実行できるようにし、それに応じて含まれているファイルをアンバンドルできるようにする必要があります。

例えば:

$ bash filebundle file2.txt

file1.txt ではなく、file2.txt のみをアンバンドルします。さらに、引数なしで filebundle をバッシングすると、filebundle 内のすべてのファイルがアンバンドルされます。

渡された引数に従ってファイルをアンバンドルするには、「if...then...else」制御構造を使用する必要があると思いますが、次のようなものを使用することしか考えられません

for i in $@; do
    grep "$i" <<'End of $i' | bash
done

filebundle 内の特定のファイルを見つけて、それらをアンバンドルします。それでも、これらをうまく機能するものにまとめることができないようです。

あなたの考えやアドバイスは大歓迎です。

4

1 に答える 1

0

バンドルを解除するときに、特定のファイルを見つける必要はありません。がそれif..thenを処理します。

ファイル バンドルを次のようなブロックのセットにします。

if [[ $# = 0 ]] || contains "file1.txt" "$@"
then
cat > file1.txt  << 'End of file1.txt'
DATA HERE
End of file1.txt
fi

wherecontainsは、残りの要素の最初の要素をチェックする関数です。たとえば、

contains() { 
    var=$1
    shift
    for f
    do 
        [[ $var = "$f" ]] && return 0
    done
    return 1
}

各ファイルは、引数がない場合、またはファイル名がそれらの中にある場合にのみバンドル解除されます。

これらのブロックの実行を開始する前に、ヘッダーに追加のロジックを追加して、指定されたすべてのファイル名がファイルに存在することを確認できます。

于 2013-07-02T23:35:44.927 に答える