web-dev-qa-db-ja.com

引数の数からループ内に配列を作成

#!/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は補間されませんが、テキスト文字列として読み込まれます。

20
spezticle

+=演算子を使用して、配列に追加できます。

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 [@]}の展開です。感嘆符は、間接参照を導入するために、左中括弧のすぐ後になければなりません。

39
jordanm