从多个参数创建循环数组

时间:2013-03-14 21:45:44

标签: arrays bash loops interpolation

#!/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没有被插值,只是被读作文本字符串。

1 个答案:

答案 0 :(得分:37)

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

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

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

echo "$@"

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

如果您想保留现有方法,则需要!使用args=() for ((i=1; i<=$#; i++)); do args[i]=${!i} done echo "${args[@]}"

{{1}}

来自Bash参考:

  

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