Bash:如何在 getopt 参数中传递脚本中命令的参数?

Bash:如何在 getopt 参数中传递脚本中命令的参数?

我想getopt在 bash 脚本中使用来处理脚本的选项。我希望我的选项之一是要传递给脚本中的命令之一的任何附加参数。

具体来说,我正在制作一个文件夹备份脚本,该脚本调用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 循环之后,后面的所有内容--仍然在位置参数中,又名"$@",因此仍然可以作为单独的单词使用。

相关内容