タブ区切りファイルを解析するbashスクリプトを作成しています。ファイルに「prompt」という単語が含まれている場合、スクリプトはユーザーに値を入力するように要求する必要があります。
ファイルを読み取るときは「読み込み」をスキップするだけなので、「読み込み」コマンドは標準入力から読み取れないようです。
ファイルと標準入力(stdin)からデータを読み取るソリューションを持っている人はいますか?
注:このスクリプトはGit BashとMacOSで実行する必要があります。
以下は、失敗した小さなコード例です。
#!/bin/bash
#for debugging
set "-x"
while IFS=$'\r' read -r line || [[ -n "$line" ]]; do
[[ -z $line ]] && continue
IFS=$'\t' read -a fields <<<"$line"
command=${fields[0]}
echo "PROCESSING "$command
if [[ "prompt" = $command ]]; then
read -p 'Please enter a value: ' aValue
echo
else
echo "Doing something else for "$command
fi
done < "$1"
出力:
$ ./promptTest.sh promptTest.tsv
+ IFS=$'\r'
+ read -r line
+ [[ -z something else ]]
+ IFS=' '
+ read -a fields
+ command=something
+ echo 'PROCESSING something'
PROCESSING something
+ [[ prompt = something ]]
+ echo 'Doing something else for something'
Doing something else for something
+ IFS=$'\r'
+ read -r line
+ [[ -z prompt ]]
+ IFS=' '
+ read -a fields
+ command=prompt
+ echo 'PROCESSING prompt'
PROCESSING prompt
+ [[ prompt = prompt ]]
+ read -p 'Please enter a value: ' aValue
+ echo
+ IFS=$'\r'
+ read -r line
+ [[ -n '' ]]
TSVファイルの例:
$ cat promptTest.tsv
something else
prompt
otherthing nelse
ベストアンサー1
最も簡単な方法は、/dev/tty
キーボード入力を読み取るために使用することです。
たとえば、
#!/bin/bash
echo hello | while read line
do
echo We read the line: $line
echo is this correct?
read answer < /dev/tty
echo You responded $answer
done
端末で実行せず、入力がプログラムにリダイレクトされることを許可しない場合、プログラムは中断されますが、そうでなければ正常に動作します。
より一般的には、元の標準入力に基づいて新しいファイルハンドルを取得して読み取ることができます。ラインexec
とread
#!/bin/bash
exec 3<&0
echo hello | while read line
do
echo We read the line: $line
echo is this correct?
read answer <&3
echo You responded $answer
done
どちらの場合も、プログラムは次のようになります。
% ./y
We read the line: hello
is this correct?
yes
You responded yes
2番目のバリアントは入力リダイレクトも受け入れます。
% echo yes | ./y
We read the line: hello
is this correct?
You responded yes