2013-03-14 40 views
9
#!/bin/bash 
COUNTER=$# 
until [ $COUNTER -eq 0 ]; do 
args[$COUNTER]=\$$COUNTER 
let COUNTER-=1 
done 
echo ${args[@]} 

当我运行它,我得到下面的结果从数量的参数创建循环数组

[email protected]:~/sandbox# ./script.sh first second third 
$1 $2 $3 

,我很期待它呼应了什么$ 1,$ 2,$ 3不是的“$ 1”

文本值我试图写在bash脚本,将创建一个数组,它是论点我给它数的大小。
我期待

[email protected]:~/sandbox# ./script.sh alpha bravo charlie 
alpha bravo charlie 

[email protected]:~/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没有被插入的方式,但只是作为文本字符串阅读。

回答

22

可以使用+=运营商要追加到一个数组。

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

这显示了如何追加可以做到,但要获得您想要的结果的最简单的方法是:

echo "[email protected]" 

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

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

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

echo "${args[@]}" 

从击参考:(!)

如果参数的第一个字符是一个感叹号,引入可变了一个间接 水平。 bash使用从参数作为 变量的名称的其余部分形成的的 可变值;然后展开此变量,并将该值用于其余替换中的 ,而不是参数本身的值。 这被称为间接扩展。例外情况是 扩展的$ {!前缀}和$ {!名称[@]}如下所述。该 感叹号必须紧跟在左大括号,以 引入间接。

+0

是的,这也正是它。感谢您的及时回复。我仍然对脚本有点小白。像往常一样+1 – spezticle 2013-03-14 22:03:15

+1

+1。仅供参考,对我来说''我''可以是一个显着的优化,因为我在大多数shell中都是“$ @”'(几乎不值一提,但我认为我以前见过你这样写过)。 – ormaaj 2013-03-14 22:37:18