サブコマンドに渡されるシェルスクリプトオプション

サブコマンドに渡されるシェルスクリプトオプション

getopts設定用のラッパースクリプトを作成していますmysqldump。これまではうまくいっています。

しかし、私がやりたいことの1つは、内容がmysqldumpコマンドに正しく渡される必要がある他のオプションをシェルスクリプトに追加することです。次のオプションを渡すのと同じです。
./mysqldumpwrapper.sh -u username -p password -h localhost -o "--no-create-db --replace"
-o引数の文字列内容をコマンドに正しく渡しますmysqldump

なぜなら、上記の内容を試してみると、getopts次のような結果が出るからです。
Invalid option: --

この問題を解決する方法を知っている人はいますか?コンテンツが別のオプションに解析されないように、オプション
入力をエスケープする方法はありますか?getopts

次に、シェルスクリプトで実際のコマンドをトリガーすると、次の結果が得られます。
mysqldump "$OPTIONSPASSTHROUGH" --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS "$DB" > "$FILE_DEST"
OPTIONSPASSTHROUGH変数にスペースがある可能性が高いため、コマンドでその変数を引用しました。そうですか?

ベストアンサー1

--表示終了オプションを指定し、次の引数がすべてサブコマンドに渡される場合は、次のようにできますman getopts

       aflag=
       bflag=
       while getopts ab: name
       do
           case $name in
           a)    aflag=1;;
           b)    bflag=1
                 bval="$OPTARG";;
           ?)   printf "Usage: %s: [-a] [-b value] args\n" $0
                 exit 2;;
           esac
       done
       if [ ! -z "$aflag" ]; then
           printf "Option -a specified\n"
       fi
       if [ ! -z "$bflag" ]; then
           printf 'Option -b "%s" specified\n' "$bval"
       fi
       shift $(($OPTIND - 1))
       printf "Remaining arguments are: %s\n$*"

getopts具体的には、処理オプションが発生するとすぐに終了することを意味するため、対応する--パラメータはすべてそのまま残ります$@。上記の例では、getopts処理されたパラメータはすべてshift削除され、残りのパラメータはすぐに印刷されます$*。同様に処理すると、次のことができます。

/mysqldumpwrapper.sh \
    -u username \
    -p password \
    -h localhost \
    -- \
    -now --all of these --are passed through

そしてラップされたアプリケーションを呼び出します。

mysqldump "$@" \
    --host=$MYSQL_HOST \
    --user=$MYSQL_USER \
    --password=$MYSQL_PASS "$DB" \
> "$FILE_DEST"

おすすめ記事