ファイルを削除するか、名前、内容に基づいてプログラムを閉じるBASHスクリプトを作成しています。特に、内容に応じてファイルを削除するのに問題があります(ケース2)。コンテンツに一致するすべてのファイルでファイルを入力できます。ただし、ユーザーがファイルを削除するかどうか(読み取りを使用)を入力する必要がある場合、私のコードは破損します。この変数は、ユーザー入力を要求せずに、削除するファイルの場所を自動的に入力します。
#!/bin/bash
#set -x
#Programmer: Redacted
#Z: ID: Redacted
#Assignment: cleaner.sh
directory=`pwd` #sets the directory variable to pwd
string="string"
file="file"
fileFound=matched.txt
possibleFiles=''
result=''
function askDelete #asks for verification
{
#echo "$fileName was found, still want to delete it? (y/n)"
read -p "$fileName was found, still want to delete it? (y/n)" continue
echo "Continue is equal to: $continue"
}
echo "Welcome to my CLEANER script!"
echo "Enter 1: delete by filename."
echo "Enter 2: delete by a string within the file."
echo "Enter 3 or quit: exit this program."
read command
case $command in
"file")
command=1 ;;
"string")
command=2 ;;
esac
case $command in
1)
#Prompts user for which file they want to delete
echo "What file would you like to delete? "
read fileName
#find $PWD -type f -name "$fileName"
#result= -x $fileName
if [ -a "$fileName" ]
then
askDelete
if [ $continue == 'y' ] || [ $continue == 'Y' ]
then
rm $fileName
echo "File has been removed"
else
echo "File has not been removed"
fi
else
echo "No files were found"
fi
;;
#case where user entered 2
#user wants to enter a string within the files to delete
2)
touch 'matched.txt' #creates the file that will be used
echo "Enter the string that you wish to have the files containing it to be destroyed"
read pattern #user enters what they want to search for
find $PWD -type f 1>possibleFiles.txt
#echo $PWD
#grep -q "$pattern" 'foundFile.txt' 1> matched.txt
echo 'This is where it breaks'
cat possibleFiles.txt | while read fileName
do
#\echo $fileName
grep -q "$pattern" "$fileName" 1> matched.txt
if [ $? == 0 ]
then
askDelete
if [ $continue == 'y' ] || [ $continue == 'Y' ]
then
rm $fileName
else
echo "No found files have been removed"
fi
else
echo "No matches for the pattern were found"
fi
done
#
# if [ $? == 0 ]
# then
# askDelete
# if [ $continue == "Y" ] || [ $continue == "y" ]
# then
# #cat matched.txt
# for file in 'matched.txt'
# do
# echo 'bleh'
# done
# else
# echo "No found files have been removed"
# fi
# else
# echo "No matches for the pattern were found"
# fi
# fi
;;
#case where user entered 3
#user wants to exit
3)
echo "Goodbye friend"
exit
;;
*)
echo Digit 1, 2 or 3 must be entered
esac
私は問題がプログラムの上部近くのAskDelete関数の内部のどこかにあると思います。具体的には、次の行は次のとおりです。 read -p "$fileName が見つかりましたが、まだ削除しますか? (y/n)" continue
助けてくれてありがとう。
ベストアンサー1
ブロック全体がファイルwhile
から(そしてパイプを介して間接的に)リダイレクトされてdone
いるため、ブロック内のすべてのコマンドは同じものを継承します。同じ入力ラインが使用されました。stdin
possibleFiles.txt
stdin
read
askDelete
possibleFiles.txt
read
幸いなことに、tty(ターミナル)はまだ利用可能です/dev/tty
。ループ内をaskDelete
次のように置き換えると、askDelete </dev/tty
すべてが期待どおりに機能します。
それでも確認を追加する必要があります。たとえば、このプログラムは端末の外部で実行することはできません(事前に入力されたy / n回答を提供する他のファイルを使用)。なぜなら、この単純な修正はもはや機能/dev/tty
しないからです。これを行わない方法を見つける必要があります。 " " stdin
。