从多个参数创建循环数组

spe*_*cle 22 arrays bash interpolation loops

#!/bin/bash
COUNTER=$#
until [ $COUNTER -eq 0 ]; do
args[$COUNTER]=\$$COUNTER
let COUNTER-=1
done
echo ${args[@]}
Run Code Online (Sandbox Code Playgroud)

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

user@host:~/sandbox# ./script.sh first second third
$1 $2 $3
Run Code Online (Sandbox Code Playgroud)

而且我期待它回应出1美元,2美元和3美元不是"1美元"的文本值

我正在尝试用bash编写一个脚本,它将创建一个数组,该数组的大小与我给它的参数数量相同.
我期待着

user@host:~/sandbox# ./script.sh alpha bravo charlie
alpha bravo charlie
Run Code Online (Sandbox Code Playgroud)

要么

user@host:~/sandbox# ./script.sh 23425 jasson orange green verb noun coffee
23425 jasson orange green verb noun coffee
Run Code Online (Sandbox Code Playgroud)

所以,目标是制作

args[0]=$1
args[1]=$2
args[2]=$3
args[3]=$4
Run Code Online (Sandbox Code Playgroud)

我拥有它的方式,$1,$2,$3不是插值,而是只是作为文本字符串读取.

jor*_*anm 43

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

args=()
for i in "$@"; do
    args+=("$i")
done
echo "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

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

echo "$@"
Run Code Online (Sandbox Code Playgroud)

要么

args=("$@")
echo "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

如果你想保持现有的方法中,你需要使用间接使用!:

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

echo "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

从Bash参考:

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