順序に関係なく、フラグが最初に処理されます。

順序に関係なく、フラグが最初に処理されます。

リモートからローカルに、オプションでリモート環境間でデータベースを同期するスクリプトを作成しています。 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ます。したがって、常にそのフラグを最初に処理し、値があることを確認し、他のフラグを処理する前にその値に設定する必要があります。$destsync_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.

役に立つプロセスは

  1. フラグ変数などのデフォルト値を設定します。
  2. コマンドラインオプション、フラグ変数の更新などを解析します。
  3. オプションが解析された後、完全性はフラグ変数などの状態を確認します。ここでは、無効な値、欠落値、または競合するオプションに対処できます。
  4. 動作するフラグ変数などを検討してください。

おすすめ記事