【问题标题】:Bash append a list to end element of arrayBash 将列表附加到数组的末尾元素
【发布时间】:2018-04-08 19:45:42
【问题描述】:

我正在尝试将一个列表添加到已经包含元素的 bash 数组的末尾,该数组包含 {a..z} 并且我想将 {0..9} 添加到该列表的末尾,我'已经尝试过 += 但这不起作用它在我的情况下清除了数组。

while [ ! $# -eq 0 ] # Argument selector for CLI input
    do
        case "$1" in
            --num | -n)
                chars=( {0..9} )
                ;;
            --char | -c)
                chars=( {a..z} )
                ;;
            --upper-char | -C)
                chars=( {A..Z} )
                ;;
            --help | -h)
                echo "Type the program name with an argument -n for numbers -c for lowercase char and -C for uppercase"
                exit
                ;;
        esac
        case "$2" in
            --num | -n)
                chars[${#chars[@]}]=( {0..9} )
                ;;
            --char | -c
                chars[${#chars[@]}]=( {a..z} )
                ;;
            --upper-char | -C)
                chars[${#chars[@]}]=( {A..Z} )
                ;;

        esac
        shift
    done

一旦我弄清楚如何附加列表,我希望做第三个 case 语句,最好的情况是每次我想添加项目时都不必对数组进行硬编码。

【问题讨论】:

    标签: arrays bash list append


    【解决方案1】:

    追加到数组是否适用于+=。 对您来说,由于代码中的其他一些错误,它似乎被覆盖了。这应该有效:

    while [ ! $# -eq 0 ] # Argument selector for CLI input
    do
        case "$1" in
            --num | -n)
                chars=( {0..9} )
                ;;
            --char | -c)
                chars=( {a..z} )
                ;;
            --upper-char | -C)
                chars=( {A..Z} )
                ;;
            --help | -h)
                echo "Type the program name with an argument -n for numbers -c for lowercase char and -C for uppercase"
                exit
                ;;
        esac
        case "$2" in
            --num | -n)
                chars+=( {0..9} )
                ;;
            --char | -c)
                chars+=( {a..z} )
                ;;
            --upper-char | -C)
                chars+=( {A..Z} )
                ;;
        esac
        shift 2
    done
    

    当它对你不起作用时, 我怀疑你只有shift 而不是shift 2, 并期望script.sh -c -n 会给你a..z0..9, 但它只给了0..9。 发生的事情只是在一个shift之后, 在while 循环中仍有一个参数需要处理, 所以在下一次迭代中,charschars=(...) 语句替换。

    我提出了这个替代实现:

    chars=()
    while [ $# != 0 ]; do
        case "$1" in
            --num | -n)
                chars+=( {0..9} )
                ;;
            --char | -c)
                chars+=( {a..z} )
                ;;
            --upper-char | -C)
                chars+=( {A..Z} )
                ;;
            --help | -h)
                echo "Type the program name with an argument -n for numbers -c for lowercase char and -C for uppercase"
                exit 1
                ;;
        esac
        shift
    done
    

    【讨论】:

    • 现在可以添加额外的案例 ' case "$2" in --num | -n) 字符+=( {0..9} ) ;; --char | -c) 字符+=( {a..z} ) ;; --upper-char | -C) 字符+=( {A..Z} ) ;; esac case "$3" in --num | -n) 字符+=( {0..9} ) ;; --char | -c) 字符+=( {a..z} ) ;; --upper-char | -C) 字符+=( {A..Z} ) ;; esac shift 3 完成'
    • 我还将第一部分更改为附加而不是您建议的等号,谢谢!
    • @user3019354 你不需要 3 个case,一个就足够了,就像我最后的建议一样。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    相关资源
    最近更新 更多