1

myBaseScript.sh次の署名を持つ(bash)シェルスクリプトがあります:

myBaseScript.sh [OPTIONS] FILE1 [FILE2 ...]

このスクリプトは、次のようにmyBaseScript.shを介してオプションを解析します。getopts

while getopts ":hi:m:s:t:v:" opt; do
    #...
done

shift $(($OPTIND-1))
FILES=("$@")

mySuperScript.shここで、 を呼び出すscript を作成して、myBaseScript.shオプションをベース スクリプトに転送できるようにします。

mySuperScript.sh [OPTIONS] DIR1 [DIR2 ...]

[OPTIONS]で使用されるオプションはどこにありますかmyBaseScript.sh。では使用されませんmySuperScript.sh

このスクリプトは、すべてのディレクトリなどmySuperScript.shをクロールし、有効なファイルのリストをコンパイルして に渡します。DIR1[DIR2]${FILES[@]}myBaseScript.sh

今私はこれを持っていますmySuperScript.sh

myBaseScript.sh "$@" "${FILES[@]}"

whereは現在のパス${FILES[@]}にあるファイルのリストです。言い換えれば、これは

mySuperScript.sh [OPTIONS] 

ただし、オプションDIR1[DIR2]、 などは対象外です。

私は使用できます

allOpts=("$@")
while getopts ":hi:m:s:t:v:" opt; do echo. > /dev/null; done
shift $(($OPTIND-1))    
DIRS=("$@")

そして as の最初のエントリ$OPTINDをに渡します。しかし、これは非常に複雑に思えます。さらに、有効なオプションのリストを に複製する必要があり、これは管理上の悪夢です。$allOpts[OPTIONS]myBaseScript.shmyBaseScript.sh

これらのオプションの解析専用の新しいスクリプトを作成することもできます。しかし、それは以前には存在しなかった依存関係を作成するため、少し厄介に思えmyBaseScript.shます...

では、これを行う最もクリーンな方法は何ですか?

4

2 に答える 2

2

とディレクトリのリストのmySuperScript.sh間に追加のマーカーを付けて呼び出すと、次のようになります。[OPTIONS]

mySuperScript.sh [OPTIONS] -- DIR1 [DIR2 ...]

次に、引数を繰り返し処理し、オプションを変数に収集できます。何かのようなもの:

while [ "$1" -ne "--" ]; do
  OPTIONS="$OPTIONS $1"
  shift
done
shift

その後、後で電話をかけることができます。

myBaseScript.sh $OPTIONS $some_list_of_files

スペースを含むオプションの引数を処理しようとしない限り、これは問題なく機能します。

より実際的な注意として、これは通常、私が Python を調べ始めるときです。

于 2014-01-28T13:31:19.787 に答える
2

ユースケース全体はわかりませんが、ファイルとディレクトリの両方をサポートすることが目標である場合は、引数がディレクトリであるかどうかを確認してクロールする単一のスクリプトを使用できます。

例えば:

#!/bin/bash

crawl_dir() {
    dir="$1"
    find "$dir" -type f
}

# parse options
while getopts ":hi:m:s:t:v:" opt; do
    echo ...
done
shift $(($OPTIND-1))

args=( "$@" )

# parse arguments
files=()
for arg in "${args[@]}"
do
    if [[ -d "$arg" ]]
    then
        files+=( $(crawl_dir "$arg") )
    else
        files+="$arg"
    fi
done

# now you have an array of files to process
process "${files[@]}"
于 2014-01-28T13:46:51.443 に答える