2017-09-21 9 views
0

2つの変数を並列に読み取る場合、このコーディングで「あいまいなリダイレクト」エラーが発生するのはなぜですか?:私はwhileループで変数を並列に読み取る

#!/bin/bash 
export fname="Adam Baden Caydin" 
export lname="Sam Tam Uam" 
while read first_name <$fname && read last_name <$lname 
do 
echo $first_name " : " $last_name 
echo "doing some processing here..... " 
done 

エラー "ペースト" を使用することはできません、しながら、またはループのために使用する必要があります。 /f1.shは:4行目:$ fnameは: ./f1.sh:ライン4あいまいなリダイレクトして "完了" 最後の行を交換

は同じ結果に

done <<< "$fname $lname" 

エラーを与えます: $のFNAME:あいまいなリダイレクト

予想される出力

Adman Sam 
Baden Tam 
Caydin Uam 
+0

私はあなたが 'read'でこれを行うことはできないと思います。なぜそれらを配列にしないのですか? – Barmar

+0

'read'は一度に1つの単語ではなく、行全体を読み込みます。 – Barmar

+1

なぜ変数をエクスポートしていますか? – Barmar

答えて

3

readは、各入力が別の行にあると予想しているので、スペースを改行で置き換える必要があります。並行して名前を読むには、対応する項目を同じ入力行に組み込む必要があります。これはpasteコマンドで実行できます。

paste <(tr ' ' '\n' <<<"$fname") <(tr ' ' '\n' <<<"$lname") | while read first_name last_name 
do 
echo $first_name : $last_name 
done 

おっとは、pasteを使っに対する制約に気づきませんでした。もう一つの解決策は、文字列の代わりに配列を使うことです:

fname=(Adam Baden Caydin) 
lname=(Sam Tam Uam) 
i=0 
for first_name in "${fname[@]}" 
do 
    last_name=${lname[$i]} 
    echo $first_name : $last_name 
    ((i++)) 
done 
+0

私はこれが好きですが、OPは "ペーストを使うことはできません"と言いました。 – sjnarv

+0

@sjnarvありがとう、配列ソリューションも追加されました。 – Barmar

+0

ペーストのためのソリューションのおかげで、それは働く:)面白いことは、/location/filename.csv /location/filename2.csv何とかそれらの間にそのスペースをキャッチしていない間に動作しないということです。これを研究するつもりです。素晴らしいソリューションありがとう:) – aymanzone

関連する問題