所以,我正在尝试编写一个脚本
1。)使用用户指定的名称创建一个新目录
2.。)将文件从远程位置下载到新目录
3.。)将端口附加到新目录中的文件
我现在拥有的是
OPTIND=1
while getopts "hpnm:" opt; do
case "$opt" in
h)
show_help
exit 0
shift
;;
p) port="*@"
shift
/home/servers/zombies/"$server_name"/server.properties >> port: "$@"
;;
n) server_name="$*"
shift
mkdir /home/ecb/servers/zombies/"$*"
;;
m) map_name="$*"
shift
rsync -azvP username@host:/home/downloads/zombies/"$*" /home/servers/zombies/"$server_name"/
;;
esac
done
当我运行脚本时,它会解释" -n Test -m test -p 1234" as"测试测试1234"。我如何分开论点?
答案 0 :(得分:1)
不要shift
。这会使getopts
混淆,因为你正在修改参数列表。
如果选项接受参数,请在参数向量中的字符后面添加冒号。在您的情况下,-p
,-n
和-m
都会接受参数,而不只是-m
。所以你的调用应该是:
while getopts "hp:n:m:" opt; do
要引用选项参数,请使用$OPTARG
。 getops会将参数放在该变量中(前提是你告诉getopts该选项需要参数)。
当getopts结束时,OPTIND
将成为第一个位置参数的索引。此时,如果您愿意,可以移走所有消耗的参数:
shift $((OPTIND-1))
或者您可以使用bash
的子序列表示法扫描它们:
for arg in "${@:OPTIND}"; do
立即采取行动通常不是一个好主意。相反,您通常会将每个参数保存到变量中,并在选项解析完成时处理变量。有几个原因:
您可能会在识别出第一个选项后检测到错误。在这种情况下,您通常希望在不改变世界状态的情况下生成错误消息。
通常,选项没有指定的顺序(这就是为什么它们用选项字母标识,而不是位置)。通常情况下,操作可以按特定顺序执行。
根据定义,选项是可选的。但是,在到达列表末尾之前,您不知道未指定选项。如果该选项具有默认值,或者该选项的非规范会影响脚本的行为,则可能需要在开始执行操作之前了解该选项。
通常没有必要初始化OPTIND
,因为bash
在创建新的执行环境时会自动执行此操作。