【问题标题】:Create array in loop from number of arguments根据参数数量在循环中创建数组
【发布时间】:2013-03-14 21:45:44
【问题描述】:
#!/bin/bash
COUNTER=$#
until [ $COUNTER -eq 0 ]; do
args[$COUNTER]=\$$COUNTER
let COUNTER-=1
done
echo ${args[@]}

当我运行它时,我得到以下结果

user@host:~/sandbox# ./script.sh first second third
$1 $2 $3

我希望它能够回显 $1、$2 和 $3 不是“$1”的文本值

我正在尝试在 bash 中编写一个脚本,该脚本将创建一个数组,该数组的大小与我给它的参数数量一样。
我期待

user@host:~/sandbox# ./script.sh alpha bravo charlie
alpha bravo charlie

user@host:~/sandbox# ./script.sh 23425 jasson orange green verb noun coffee
23425 jasson orange green verb noun coffee

所以,目标是让

args[0]=$1
args[1]=$2
args[2]=$3
args[3]=$4

按照我的方式,$1,$2,$3 没有被插值,而是被读取为文本字符串。

【问题讨论】:

    标签: arrays bash loops interpolation


    【解决方案1】:

    您可以使用+= 运算符追加到数组。

    args=()
    for i in "$@"; do
        args+=("$i")
    done
    echo "${args[@]}"
    

    这显示了如何进行追加,但获得所需结果的最简单方法是:

    echo "$@"
    

    args=("$@")
    echo "${args[@]}"
    

    如果你想保留你现有的方法,你需要使用indirection!

    args=()
    for ((i=1; i<=$#; i++)); do
       args[i]=${!i}
    done
    
    echo "${args[@]}"
    

    来自 Bash 参考:

    如果参数的第一个字符是感叹号 (!),则 引入了变量间接级别。 Bash 使用的值 由参数的其余部分形成的变量作为 多变的;然后扩展此变量并将该值用于 其余的替换,而不是参数本身的值。 这称为间接扩展。例外情况是 ${!prefix } 和 ${!name[@]} 的扩展如下所述。这 感叹号必须紧跟左大括号,以便 引入间接性。

    【讨论】:

    • 是的,就是这样。感谢您的及时回复。我对脚本还是有点菜鸟。
    • 像往常一样+1。仅供参考,在大多数 shell 中,for i 可以比 for i in "$@" 进行显着优化(几乎不值得一提,但我想我以前见过你这样写。)
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 2014-04-18
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2021-12-11
    相关资源
    最近更新 更多