순서에 관계없이 플래그가 먼저 처리됩니다.

순서에 관계없이 플래그가 먼저 처리됩니다.

원격에서 로컬로, 선택적으로 원격 환경 간에 데이터베이스를 동기화하는 스크립트를 작성 중입니다. 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. 작동할 플래그 변수 등을 고려하세요.

답변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먼저 설정되고(여러 번, 이전 설정을 덮어쓸 때마다) 사용자가 지정한 순서대로(여러 번) 수행됩니다.

관련 정보