ponponpoko
@ponponpoko (Takeshi Sakiyama)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【シェルスクリプト】while文内で処理を一時停止させるには・・・?

解決したいこと

テキストをreadコマンドで読み込むループWhile文内の処理を一旦停止できるようにしたい。
※ シェルスクリプト(Linux/AIX)

現在の状況

check.txt
100
200
300
400
while文(ループ)
while read line; do
  echo $line
  read -p "--> 確認してください。【Enter】" stop
done < /work/check.txt
実行結果
100
300

テキストをreadコマンドで読み込むループWhile文の結果を下記のようにしたい。

実行結果
100
--> 確認してください。【Enter】
200
--> 確認してください。【Enter】
300
--> 確認してください。【Enter】
400
--> 確認してください。【Enter】

なぜこういう実行結果なのか?

readコマンドで複数変数を指定する状況と同じになっているため、そのような結果になっている。
例: read line stop

どうしようか・・・。

sleepコマンドで数秒待機する方法をとるしかないのか・・・?
標準入力待ち状態で待機させたのですが、ほかに手段が思いつきません!
どなたかアドバイスをよろしくお願いいたします。

0

2Answer

標準入力がリダイレクトでファイルになっているのでキー入力にしたいところにもファイルからの入力が入ってしまうわけですが、読み込むのがファイルでそれほど大きくないならこういう対応はいかがでしょう?

for line in $(cat ./check.txt)
do
    echo $line
    read -p "--> 確認してください。【Enter】" stop
done
3Like

ファイル入力用のFile Descriptor(FD)とキー入力受付用のFD(標準入力)が被っているのが原因です。
なので、ファイル入力用のFDを別にする方法もあります。
※File DescriptorについてはWeb上にたくさん情報があるので割愛します。

# 新しく5番でFDを開く
exec 5</work/check.txt

# readコマンドに読み込み元FDを指定する
while read -u 5 line; do
  echo $line
  read -p "--> 確認してください。【Enter】" stop
done
2Like

Comments

  1. @ponponpoko

    Questioner

    FDの存在を忘れていました・・・。
    FDをそれぞれ変えてやってみたいと思います!!!
    ご教授、ありがとうございました。

Your answer might help someone💌