我正在编写一个包装脚本,用于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}"
作为一般规则:您应该引用所有内容(可能被引用的内容)。