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"
答え2
1つの解決策は次のとおりです。
... -o "x--no-create-db --replace"
# in the script:
option="${option#x}"
一般に、引用できるすべての項目を引用する必要があります。