Bash:getopt引数にスクリプトのコマンドパラメータを渡す方法は?

Bash:getopt引数にスクリプトのコマンドパラメータを渡す方法は?

getoptbashスクリプトのオプションを使用してスクリプトを処理したいです。私のオプションの1つは、スクリプト内のコマンドの1つに渡される追加のパラメータになりたいです。

具体的には、次のオプションを呼び出すフォルダバックアップスクリプトを作成しています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ループの後に続くすべての項目は--まだ位置パラメータ(別名)にあるため、"$@"それでも別の単語として使用できます。

関連情報