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 に答える