2016-06-30 1 views
0

私はシェルスクリプトを学んでいます。私はデータファイルを持っています。行は口座のデータを表します。ファイル入力で動いている文中のシェルスクリプトで明示的に標準入力で "read"関数を使うことはできますか?

データファイル:DATA.DAT

name0 domain0 password0 
name1 domain1   # this line is lack of third data. 

次のスクリプトは、ラインによって機能ラインを「読み取る」ことによって、すべてのデータのロードデータファイルを表示します。

スクリプトの例:

sh display_data.sh data.dat 

によってdisplay_data.sh

#!/bin/sh 

INPUT_FILE=$1 

while read V1 V2 V3 
do 
    if [ -z "$V3" ]; then 
    # when V3 is empty, I want to get it through standard input 
    # but it load data from $INPUT_FILE 
    read V3 # Here is my problem. 
    # read V3 < /dev/stdin # I want like this. 
    fi 
    echo "V1 = $V1, V2 = $V2, V3 = $V3" 
done < $INPUT_FILE 

実行スクリプトは、問題はしばらく文がのリダイレクトを使用していますので、私はしばらくの文内部標準入力で読み取る機能を使用することができなかったですデータファイル。 データファイルの3番目の列が不足している可能性があります。私は不足しているデータを入力するスクリプトを実行するユーザーを求めるだろう。

誰にも解決策や提案はありますか? ありがとうございます。

答えて

2

あなたは私の答えhereを読むことができます。

exec機能を使用すると、異なるfdを使用して入力ファイルを開き、stdinからreadに開くことができます。

exec {FD}<${INPUT_FILE} 
while read -u ${FD} V1 V2 V3 
do 
if [ -z "$V3" ]; then 
    read V3 
fi 
echo "V1 = $V1, V2 = $V2, V3 = $V3" 
done 

PS:私はむしろ、ファイルディスクリプタをハードコーディングするよりも、$FDで未使用のファイルディスクリプタを取得するために、スクリプトを変更しました。

+0

ありがとうFazlin。それは私にとって素晴らしい答えです。しかし、私は一点不安を持っています。それは5としてfdを指定しますが、私はいつもfd 5を使うことができますか? – mora

+0

別のコメントは、重複のためにこの質問を削除しますか?私は感謝の念を示すために答えを受け入れたいと思いますが、私はこの質問を削除すると受け入れが削除されるのではないかと心配しています。どうもありがとうございました。 – mora

+0

私はランダムにfdとして5を選択しました。あなたはfdとしてより大きな数字を使うことができますが、stdin/stdout/stderrのすべてのプロセスでデフォルトで使用されているようにfdとして数字<4を使用しません。これは正確に重複した質問ではありませんでしたが、同じ 'exec'ソリューションが両方の問題を解決するために使用できるので、私はリンクを参照しました。 – Fazlin

関連する問題