2016-12-01 2 views
1

Bashには特別な変数[email protected]があり、スクリプトまたは関数に送られたすべてのパラメータが配列に格納されます。この変数の値を読み取り専用配列に格納するにはどうすればよいですか?

それは、このエラーをスロー実行
#!/bin/bash 

declare -ar Args="[email protected]"; 

$ /home/jason/bourne --help memory; 
/home/jason/bourne: line 3: Args: readonly variable 

これは、構文の間違いですかこのbashでpossilbeされていない

は、私は、スクリプト/home/jason/bourneを持って言いますか?


途中でこれを書いて解決策を見つけました。私はそれが参考になる質問だと思うので、私は答えを掲示します。

答えて

2

ソリューション

配列として"[email protected]"変数を格納するためには、あなたは配列リテラルの場合と同じよう()でそれをラップする必要があります。

#!/bin/bash 

declare -ar Args=("[email protected]"); 

for arg in "${Args[@]}"; do 
    echo "${arg}"; 
done; 

出力例は:

$ /home/jason/bourne --help memory "quoted phrase"; 
--help 
memory 
quoted phrase 

は注:[email protected]常に""でラップする必要があります。 (おそらくこのルールには例外がありますが、少なくとも99.9%の時間を守る必要があります)この場合、("[email protected]")ではなく([email protected])を使用してください。

説明

bashで最初から配列リテラルを作成するには、あなたがこれを行うだろう:

declare -ar array=("a" "b" "c d"); 

"[email protected]"変数は引用符で包まれた各文字列と文字列のリストに展開されます。 ()でこのリストをラップすると、bash配列に変換されます。例えば

declare -ar array=("[email protected]"); 

"[email protected]""a" "b" "c d"に展開ならば、その後、("[email protected]")("a" "b" "c d")になります。

"[email protected]" == "a" "b" "c d" 
("[email protected]") == ("a" "b" "c d") 

ここ側コード例による側です。

#!/bin/bash 

declare -ar array=("[email protected]"); 
for val in "${array[@]}"; do 
    echo "${val}"; 
done; 

が出力されます。この:

#!/bin/bash 

declare -ar array=("a" "b" "c d"); 
for val in "${array[@]}"; do 
    echo "${val}"; 
done; 

意志の出力と同じこと:

$ /home/jason/bourne "a" "b" "c d"; 
a 
b 
c d 

はこれに/home/jason/bourneスクリプトを設定し、これに/home/jason/bourneスクリプトの設定

$ /home/jason/bourne; 
a 
b 
c d 
+1

'(...)'は展開に全く関与していないことに注意してください。 '' $ @ ''は配列*の中の*(*)の中に展開され、'(...) 'の内容は配列パラメータの要素として割り当てられます。 – chepner

+0

@chepner '' $ @ "'の代わりに '$ @'を使うのは間違いです。他の人が同じミスをしないように、私はそれを指摘するための注釈を追加しました。 – GreenRaccoon23

関連する問題