代码之家  ›  专栏  ›  技术社区  ›  Alex N.

将变量列表传递给bash脚本

  •  3
  • Alex N.  · 技术社区  · 16 年前

    我需要能够读取特定参数后面的变量列表(类似于mysqldump--databasedb1db2db3)

    基本上,脚本应该这样调用:

    ./charge.sh --notify --target aig wfc msft --amount 1bln
    

    在脚本本身中,我需要将“aig wfc msft”分配给单个变量,或者从中创建一个数组。

    这样做的好方法是什么?

    2 回复  |  直到 16 年前
        1
  •  10
  •   Kyle Ambroff    16 年前

    我经常发现 转移 在这种情况下非常有用的语句。在while循环中,您可以测试case语句中的预期选项,在每次使用shift进行迭代时弹出参数0,直到到达末尾或第一个位置参数为止。

    当你到达 --目标 循环中的参数,可以使用shift,将其从参数列表中弹出,然后在循环中,将每个参数附加到一个列表(在本例中为$target_list)并移动,直到到达参数列表的末尾或下一个选项(当“$1”以“-”开头时)。

    NOTIFY=0
    AMOUNT=''
    TARGET_LIST=''
    
    while :; do
        case "$1" in
            -h|--help)
                echo "$HELP"
                exit 0
                ;;
            --notify)
                NOTIFY=1
                shift
                ;;
            --amount)
                shift; AMOUNT="$1"; shift
                ;;
            --target)
                shift
                while ! echo "$1" | egrep '^-' > /dev/null 2>&1 && [ ! -z "$1" ]; do
                    TARGET_LIST="$TARGET_LIST $1"
                    shift
                done
                ;;
            -*)
                # Unexpected option
                echo $USAGE
                exit 2
                ;;
            *)
                break
                ;;
        esac
    done
    
        2
  •  2
  •   jschmier    16 年前

    如果可以这样调用脚本(注意引号):

    ./charge.sh --notify --target "aig wfc msft" --amount 1bln

    您可以将“aig wcf msft”分配给单个变量。

    如果无法更改调用脚本的方式,并且可以确保--target选项参数始终后跟另一个选项或其他分隔符,则可以获取它们之间的参数并将它们存储在变量中。

    var=$(echo $* | sed -e 's/.*--target\(.*\)--.*/\1/')
    推荐文章