用getopts分隔参数

时间:2015-04-22 03:06:33

标签: bash shell scripting getopts

所以,我正在尝试编写一个脚本

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"。我如何分开论点?

1 个答案:

答案 0 :(得分:1)

  1. 不要shift。这会使getopts混淆,因为你正在修改参数列表。

  2. 如果选项接受参数,请在参数向量中的字符后面添加冒号。在您的情况下,-p-n-m都会接受参数,而不只是-m。所以你的调用应该是:

    while getopts "hp:n:m:" opt; do
    
  3. 要引用选项参数,请使用$OPTARG。 getops会将参数放在该变量中(前提是你告诉getopts该选项需要参数)。

  4. 当getopts结束时,OPTIND将成为第一个位置参数的索引。此时,如果您愿意,可以移走所有消耗的参数:

    shift $((OPTIND-1))
    

    或者您可以使用bash的子序列表示法扫描它们:

    for arg in "${@:OPTIND}"; do
    
  5. 立即采取行动通常不是一个好主意。相反,您通常会将每个参数保存到变量中,并在选项解析完成时处理变量。有几个原因:

    • 您可能会在识别出第一个选项后检测到错误。在这种情况下,您通常希望在不改变世界状态的情况下生成错误消息。

    • 通常,选项没有指定的顺序(这就是为什么它们用选项字母标识,而不是位置)。通常情况下,操作可以按特定顺序执行。

    • 根据定义,选项是可选的。但是,在到达列表末尾之前,您不知道未指定选项。如果该选项具有默认值,或者该选项的非规范会影响脚本的行为,则可能需要在开始执行操作之前了解该选项。

  6. 通常没有必要初始化OPTIND,因为bash在创建新的执行环境时会自动执行此操作。