Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2722

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

$
0
0

環境

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でループしている場合の対処としてこの記事は残します。

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

https://oshiete.goo.ne.jp/qa/8511926.html


Viewing all articles
Browse latest Browse all 2722

Trending Articles