2016-11-02 5 views
1

構造化ファイルの情報をBashスクリプトを使って連想配列に読み込もうとしています。このファイルには、各行に「|」で区切られた人物の名前とそのアドレスが含まれています。例:ファイルをBashの連想配列に読み込む

person1|address of person1 
person2|address of person2 
... 
personN|address of personN 

以下のスクリプトを使用してこれを試みました。 WHILEループ内で、情報が印刷されています。しかし、FORループでは、情報は印刷されません。情報がWHILEループの外側の連想配列に格納されていないようです。

私は間違っていますか?なぜこれは動作していないのですか?もっと効率的な方法がありますか?パイプラインにおけるcut

答えて

1
#!/bin/bash 
declare -A address 
while IFS=\| read name add 
do 
    address[$name]=$add 
done < adresses.txt 

for name in ${!address[*]} 
do 
    echo "$name - ${address[$name]}" 
done 
cat addresses.txt | while read line 
do 
    ... 
done 

シェルコマンドの

#!/bin/bash 
declare -A address 
cat adresses.txt | while read line 
do 
    name=`echo $line | cut -d '|' -f 1` 
    add=`echo $line | cut -d '|' -f 2` 
    address[$name]=$add 
    echo "$name - ${address[$name]}" 
done 

for name in ${!address[*]} 
do 
    echo "$name - ${address[$name]}" 
done 
+0

はい!それが問題でした! しかし、今私は別の問題があります。人名にスペースが含まれていると、FORループが正しく機能しません。 – Zaratruta

5

間違っ無駄な使用はサブシェルで実行されます。サブシェルに設定された変数は、親シェルには表示されません。

これを解決するには、パイプラインをリダイレクトに置き換えます。

while read line 
do 
    ... 
done < addresses.txt 
+1

OPのコードで 'cut'はちょうど非効率的で間違っていませんでした。しかし、「cat」は役に立たず、間違っていた。 – chepner

+0

すみません。私はスクリプトで間違いを犯しました。しかし、私は元の投稿を修正しました。切断コマンドが正しく機能しています。 WHILEループ内の連想配列の情報にアクセスできます。しかし、私はそれをFORループでアクセスすることはできません。 – Zaratruta

+0

なぜ猫は役に立たず、間違っているの? – Zaratruta

関連する問題