リモートからローカルに、オプションでリモート環境間でデータベースを同期するスクリプトを作成しています。 syncコマンドを実行する前に、リモート環境間で同期するためのフラグを処理する必要がありますが、ここでの多くの回答でこの基準を使用すると、while getopts ... case
フラグの順序が異なります。それでは、他のすべてのフラグを処理する前に、リモート環境の同期を表すフラグ(および同期する環境の値)をどのようにキャプチャしますか?
dest='local'
if [ has_param "p" ]
fi
if [ $# -eq 0 ];
then
usage
exit 0
else
while getopts 'wnechsp:' flag; do
case "${flag}" in
p) dest=$OPTARG ;;
w) sync_www "$dest" ;;
n) sync_news ;;
e) sync_express ;;
c) sync_catalog ;;
g) sync_handbook ;;
s) sync_sites ;;
esac
done
fi
この状態でこのスクリプトを次のように呼び出すと、sync.bash -w -p stage
$dest
関数を呼び出すときにデフォルトの「local」設定が維持されますsync_www "$dest"
。ただし、次のようにスクリプトを呼び出すと、呼び出す前に「ステップ」に変わりsync.bash -pstage -w
ます。したがって、常にそのフラグを最初に処理し、値があることを確認し、他のフラグを処理する前にその値に設定する必要があります。$dest
sync_www "$dest"
-p
$dest
特定のフラグの存在を検出するがその値を検索しない別の答えが見つかりました。
has_param() {
local term="$1"
shift
for arg; do
if [[ $arg == "$term" ]]; then
return 0
fi
done
return 1
}
答え1
まずオプションを分析し、それからアクション。
#!/bin/sh
# This example uses no default dest value,
# and expects the user to use -p to set it.
unset dest
do_sync_news=false
do_sync_express=false
do_sync_catalog=false
do_sync_handbook=false
do_sync_sites=false
while getopts 'wnechsp:' flag; do
case $flag in
p) dest=$OPTARG ;;
w) do_sync_www=true ;;
n) do_sync_news=true ;;
e) do_sync_express=true ;;
c) do_sync_catalog=true ;;
g) do_sync_handbook=true ;;
s) do_sync_sites=true ;;
*) echo 'error' >&2; exit 1
esac
done
shift "$(( OPTIND - 1 ))"
if [ -z "$dest" ]; then
echo 'No destination (-p)' >&2
exit 1
fi
"$do_sync_www" && sync_www "$dest"
"$do_sync_news" && sync_news "$dest"
# etc.
役に立つプロセスは
- フラグ変数などのデフォルト値を設定します。
- コマンドラインオプション、フラグ変数の更新などを解析します。
- オプションが解析された後、完全性はフラグ変数などの状態を確認します。ここでは、無効な値、欠落値、または競合するオプションに対処できます。
- 動作するフラグ変数などを検討してください。
答え2
次のことができます。
actions=
add_action() {
actions="$actions
$1"
}
while getopts 'wnechsp:' flag; do
case "${flag}" in
p) dest=$OPTARG ;;
w) add_action 'sync_www "$dest"' ;;
n) add_action sync_news ;;
e) add_action sync_express ;;
c) add_action sync_catalog ;;
g) add_action sync_handbook ;;
s) add_action sync_sites ;;
esac
done
eval "$actions"
これは$dest
最初に設定され(複数回、以前の設定を上書きするたびに)、ユーザーが指定した順序で(複数回)実行されます。