【问题标题】:Iterate over options with bash case使用 bash 案例迭代选项
【发布时间】:2017-09-06 23:13:00
【问题描述】:

我正在尝试将一串选项提供给 bash 脚本并将它们分配给带有大小写的变量。我相信案例是有条件的。有没有办法让 case 循环遍历选项并分配变量?我正在使用一些一次并循环使用其他一些。在 case 语句之后打印循环不起作用。

示例:

运行脚本: ./ping_ds_replication_setup --bind_dn nate --bind_password 密码 --slave_ds_servers server1 server2 server-name.troweprice.io --master_ds_server server3 --admin_uid nate --admin_password 密码

当前输出: ping_bind_dn:自然 绑定密码:密码 辅助服务器:server1 辅助服务器:server2 辅助服务器:server-name.troweprice.io 主 ds 服务器:server3 admin_uid:自然 admin_password: 密码

脚本:

while [ -n 1 ]; do
    case "$1" in
  --bind_dn)
    ping_bind_dn=$2
    printf "ping_bind_dn: $ping_bind_dn\n"
    shift
    ;;
  --bind_password)
    bind_password=$2
    printf "bind password: $bind_password\n"
    shift
  ;;
  --admin_uid)
    admin_uid=$2
    printf "admin_uid: $admin_uid\n"
    shift
  ;;
--admin_password)
    admin_password=$2
    printf "admin_password: $admin_password\n"
    shift
  ;;
  --master_ds_server)
  master_ds_server=$2
  printf "master ds server: $master_ds_server\n"
  shift
  ;;
  --slave_ds_servers)
    slave_raw_input=( $@ )
    slave_switch_removed=${slave_raw_input[@]:1}
    regex2=$(grep -Po '.*?(?=--)'  <<<  ${slave_switch_removed[@]})
    secondary_ds_server=($(echo "${regex2}"|head -n 1))
     for secondary_server in "${secondary_ds_server[@]}"; do
       printf "secondary servers: $secondary_server \n"
    done
    shift
   esac
   shift
done

for secondary_server in "${secondary_ds_server[@]}"; do
   printf "secondary servers outside case: $secondary_server \n"
done

【问题讨论】:

  • 请参阅此处了解循环解决方案:stackoverflow.com/a/7948533/402322
  • 我能够通过测试空格来跳出循环,因为所有选项都有参数。使用 while [[ $1 != "" ]];做

标签: bash case options


【解决方案1】:

对于处理长选项 getopts 将不起作用,作为一种解决方法,您可以:

#!/bin/bash

for arg in "$@"; do
    shift
    case "$arg" in
        --hello) echo "$1" ;; 
        --bye) echo "$1"  ;;
        --help) echo "Help" ;;
        *) echo "Option doesn't exist"; exit 1 ;;
    esac
done

输出将是:

$ ./test_args.sh --hello "Hi, what's up?" --bye Goodbye! --help --hello Hi!
Hi, what's up?
Goodbye!
Help
Hi!

唯一需要注意的是,您必须引用它们之间有空格的参数。

【讨论】:

    【解决方案2】:

    我认为这个例子会有所帮助:

    $ cat example.sh
    #! /bin/sh
    while getopts "h?o:" opt; do                                                 
        case "$opt" in                                                               
        h|\?)                                                                        
            echo help actions                                                           
            ;;                                                                       
        o)                                                                           
            echo $OPTARG                                                         
            ;;                                                                       
        esac                                                                         
    done
    

    你可以调用你的脚本:

    $ ./example.sh -h
    

    执行 h) 案例,或者你可以这样做

    $ ./example.sh -o argument
    

    执行 o) 案例,在变量 OPTARG 中接收“参数”。

    【讨论】:

    • 什么时候我想做./example.sh -o argument -h argument
    • 这不适用于问题中发布的使用 GNU 样式长选项(如 --bind_dn)的示例,它仅适用于短选项,如 -h(但不适用于 --help
    • 您可以使用 -o 参数,因为字符串模式中的“:”在 'o' 字符之后。您可以在所需的所有参数中使用“:”。
    • @odradek,你是对的,但是原始问题在发送我的答案后被编辑,在原始问题中没有任何示例代码。
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多