28
#!/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不是被插值,而是被作为文本字符串读取。

4

1 回答 1

56

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

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[@]}"

来自 Bash 参考:

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

于 2013-03-14T21:55:53.593 回答