LoginSignup
1
2

More than 3 years have passed since last update.

readを使用してwhileでループしている場合にうまく対話処理できないときは

Posted at

環境

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)

やりたいこと

  1. 対象のディレクトリ配下の空のディレクトリを検索し削除する。
  2. 空のディレクトリがある場合、毎回削除するか確認する。

結論

  • readを使用してwhileでループしている場合、while内で対話処理するreadは実行されない。
  • 対処方法としてforでループする。

対象コード変更前

PARA_DIR=`pwd`

find ${PARA_DIR} -type d -empty | while read TARGET_RMDIR; do
  echo "`$basename ${TARGET_RMDIR}`を削除する場合yを入力してください。"
  read input  #ここで対話処理したい
  if [ "${input}" = "y" ]; then
    rmdir ${TARGET_RMDIR}
  fi
done 
  • 実行結果
(空のディレクトリのパス)を削除する場合yを入力してください。

read inputに指定しているところで処理が止まってくれない。原因は既にwhileでreadを使用しており、標準入力がfind ${PARA_DIR} -type d -emptyの結果だけとなるため。readは二回使えない。

対象コード変更後

PARA_DIR=`pwd`

TARGET_RMDIR=(`find ${PARA_DIR} -type d -empty`)
for (( i = 0; i < ${#TARGET_RMDIR[@]}; i++ )) do
  echo "`basename ${TARGET_RMDIR[i]}`を削除する場合yを入力してください。"
  read input
  if [ "${input}" = "y" ]; then
    rmdir ${TARGET_RMDIR[i]}
  fi
done
  • 実行結果
(空のディレクトリのパス[1])を削除する場合yを入力してください。
y #対話式で入力
(空のディレクトリのパス[2])を削除する場合yを入力してください。
y #対話式で入力
(空のディレクトリのパス[3])を削除する場合yを入力してください。
y #対話式で入力

あらかじめ削除対象のディレクトリを配列で保持し、for文でループする。

後からわかったこと

ディレクトリ削除をコンソールで確認するには以下でもいいことが判明。。。

rm -ri "$TARGET_RMDIR" < /dev/tty

やりたいことは達成できるけど、readを使用してwhileでループしている場合の対処としてこの記事は残します。

参考にさせていただいたサイト

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2