Bash: getopt 인수로 스크립트의 명령 매개변수를 전달하는 방법은 무엇입니까?

Bash: getopt 인수로 스크립트의 명령 매개변수를 전달하는 방법은 무엇입니까?

getoptbash 스크립트의 옵션을 사용하여 스크립트를 처리하고 싶습니다 . 내 옵션 중 하나가 스크립트의 명령 중 하나에 전달될 추가 매개변수가 되기를 원합니다.

특히 다음과 같은 옵션을 호출하는 폴더 백업 스크립트를 만들고 있습니다 rdiff-backup.

 TEMP=`getopt -o s:l:r:n:e:m:k:d:a: --long source-dir:,local-dest-dir:,remote-dest-dir:,logger-name:,err-report-dir:,email-receiver:,remove-older-than:,remote-dest-server:,additional-rdi>
              -n 'rdiff_backup_dir' -- "$@"`
      if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
 
 # Note the quotes around `$TEMP': they are essential!
 eval set -- "$TEMP"
      while true; do
   case "$1" in
     -s | --source-dir ) folder_to_backup="$2"; shift 2 ;;
     -l | --local-dest-dir ) local_backup_folder="$2"; shift 2 ;;
     -r | --remote-dest-dir ) remote_server_backup_folder="$2"; shift 2 ;;
     -d | --remote-dest-server ) backup_server="$2"; shift 2 ;;
     -n | --logger-name ) logger_name="$2"; shift 2 ;;
     -e | --err-report-dir ) error_report_dir="$2"; shift 2 ;;
     -m | --email-receiver ) email_receiver="$2"; shift 2 ;;
     -k | --remove-older-than ) remove_older_than="$2"; shift 2 ;;
     -a | --additional-rdiff-backup-args ) additional_rdiff_backup_args="$2"; shift 2 ;;
     -- ) shift; break ;;
     * ) break ;;
   esac
 done

rdiff-backup나중에 이와 같이 스크립트를 호출 하여 사용자가 지정한 추가 매개변수와 함께 매개변수로 제공하고 싶습니다 .

rdiff-backup  \
       --ssh-no-compression \
       ${additional_rdiff_backup_args} \
       "${folder_to_backup}" "${local_backup_full_path}/" 2> "${error_report_dir}/${folder_to_backup_basename}_$(hostname).txt"

그러나 이 설정을 테스트하기 전에 다음과 같이 추가 매개변수를 변수에 넣고 이를 스크립트에 전달하는 과정에서 첫 번째 장애물에 부딪혔습니다.

additional-rdiff-backup-args="--exclude "${nc_data_dir}/data/.opcache" --exclude "${nc_data_dir}/data/access.log" --exclude "${nc_data_dir}/data/error.log"  --exclude "${nc_data_dir}/dat>

rdiff-backup-dir --source-dir ${nc_data_dir} \
                 --local-dest-dir ${local_backup_location} \
                 --remote-dest-server ${backup_server} \
                 --remote-dest-dir ${remote_server_backup_folder} \
                 --remove-older-than 6M
                 --additional-rdiff-backup-args "${additional-rdiff-backup-args}"

스크립트에 전달할 매개변수를 생성하는 줄이 오류와 함께 실패합니다 No such file or directory. 매개변수 문자열과 같은 것을 구축하려는 간단한 시도도 실패했습니다.

# additional-rdiff-backup-args="--exclude "${HOME}""
bash: additional-rdiff-backup-args=--exclude /root: No such file or directory

그래서 내 질문은 위의 작업이 실패하는 이유와 스크립트의 명령에서 사용할 스크립트에 이러한 매개 변수를 전달하는 올바른 방법은 무엇입니까?

답변1

스크립트 인터페이스를 다시 생각해볼 것을 제안합니다. 이를 수행하는 안전한 방법은 스크립트 옵션을 명령 옵션과 분리하는 것입니다.--

rdiff-backup-dir --source-dir "${nc_data_dir}" \
                 --local-dest-dir "${local_backup_location}" \
                 --remote-dest-server "${backup_server}" \
                 --remote-dest-dir "${remote_server_backup_folder}" \
                 --remove-older-than 6M \
                 -- \
                 --exclude "${nc_data_dir}/data/.opcache" \
                 --exclude "${nc_data_dir}/data/access.log" \
                 --exclude "${nc_data_dir}/data/error.log"  \
                 --exclude "${nc_data_dir}/dat...

그런 다음 getopt while 루프 이후에 뒤따르는 모든 항목은 --여전히 ​​위치 매개변수(일명)에 있으므로 "$@"여전히 별도의 단어로 사용할 수 있습니다.

관련 정보