파일을 삭제하거나 이름, 내용을 기반으로 프로그램을 닫는 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
.