2017-12-31 56 views
1

私が使用してファイルから入力を読みました:

declare -a ARR  
    readarray -t ARR < <(cat /etc/passwd | tr "\n" "\n") 

これは罰金、それを印刷しますが、私はそれぞれの行にアクセスしたい:

printf '%s\n' "${ARR[@]} 

これはスペースの入力を分割されます。

for i in ${ARR[@]}; do 
     echo ${i} 
    done 

echoには、正しく印刷するための特別なオプションが必要ですか? this answerに基づいて、echo "${i}"に変更する必要がありますが、修正する必要はありません。

for i in ${ARR[@]}; do 

をして:置き換え、スペース上の分裂を避けるために

printf "${i} \n" 
+2

'tr"とは何ですか\ n "" \ n " –

答えて

2

: これは、同じ問題を抱えている

for i in "${ARR[@]}"; do 

二重引用符がないと、シェルは単語分割を行います。

echo ${i}echo "${i}"に置き換えるのが最もよいでしょう。二重引用符を使用しない場合、${i}は単語分割(複数の空白が1つの空白になる)およびパス名の拡張(シェルアクティブ文字を含む単語が現在のファイル名に置き換えられるディレクトリ)。

+1

ほとんどの変数/配列/コマンド展開は二重引用符で囲む必要があります。二重引用符をオフにしておくのが安全な状況がいくつかありますが、IMOでは、二重引用符を使用するよりも安全な場所を把握することが大変です。 –

+0

二重引用符で囲まれた$ {ARR [*]} "は、セパレータに' $ IFS'の最初の文字を使用します。 – cdarke

関連する問題