shell脚本选项传递给子命令

shell脚本选项传递给子命令

我正在编写一个包装脚本,用于getopts设置mysqldump.到目前为止运作良好。

然而,我想做的一件事是能够在我的 shell 脚本中添加另一个选项,该选项的内容应该准确地传递给 mysqldump 命令。有点像选项这样传递:
./mysqldumpwrapper.sh -u username -p password -h localhost -o "--no-create-db --replace"
将 -o 参数的字符串内容精确传递到我的mysqldump命令。

因为我在尝试上述操作时使用getopts,所以得到以下输出:
Invalid option: --

有谁知道如何解决这个问题?
有没有办法逃避选项的输入,这样getopts就不会将内容解析为另一个选项?

然后,当涉及到从我的 shell 脚本触发实际命令时,这就是我所得到的:
mysqldump "$OPTIONSPASSTHROUGH" --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS "$DB" > "$FILE_DEST"
因为 OPTIONSPASSTHROUGH 变量中很可能有空格,所以我在该命令中引用了该变量。那是对的吗?

答案1

如果您指定--标记选项结束,并且所有以下参数都将传递给子命令,您可以执行类似以下操作man getopts

       aflag=
       bflag=
       while getopts ab: name
       do
           case $name in
           a)    aflag=1;;
           b)    bflag=1
                 bval="$OPTARG";;
           ?)   printf "Usage: %s: [-a] [-b value] args\n" $0
                 exit 2;;
           esac
       done
       if [ ! -z "$aflag" ]; then
           printf "Option -a specified\n"
       fi
       if [ ! -z "$bflag" ]; then
           printf 'Option -b "%s" specified\n' "$bval"
       fi
       shift $(($OPTIND - 1))
       printf "Remaining arguments are: %s\n$*"

具体来说,我指的是最后的结尾 -getopts当遇到选项时停止处理选项--,因此所有这些参数都将保留在$@.在上面的示例中,所有getopts已处理的参数都被shift删除,剩余的参数立即作为 打印出来$*。如果你类似地处理它,你可以进行以下工作:

/mysqldumpwrapper.sh \
    -u username \
    -p password \
    -h localhost \
    -- \
    -now --all of these --are passed through

并调用包装的应用程序:

mysqldump "$@" \
    --host=$MYSQL_HOST \
    --user=$MYSQL_USER \
    --password=$MYSQL_PASS "$DB" \
> "$FILE_DEST"

答案2

一种解决方法是:

... -o "x--no-create-db --replace"

# in the script:
option="${option#x}"

作为一般规则:您应该引用所有内容(可能被引用的内容)。

相关内容