bash:ファイルを読み込むときのユーザー入力プロンプト

bash:ファイルを読み込むときのユーザー入力プロンプト

タブ区切りファイルを解析する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

端末で実行せず、入力がプログラムにリダイレクトされることを許可しない場合、プログラムは中断されますが、そうでなければ正常に動作します。

より一般的には、元の標準入力に基づいて新しいファイルハンドルを取得して読み取ることができます。ラインexecread

#!/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

おすすめ記事