원격에서 로컬로, 선택적으로 원격 환경 간에 데이터베이스를 동기화하는 스크립트를 작성 중입니다. 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
먼저 설정되고(여러 번, 이전 설정을 덮어쓸 때마다) 사용자가 지정한 순서대로(여러 번) 수행됩니다.