이 부분을 개선하거나 정리할 수 있는지 궁금합니다. 아이디어는 사용자가 세 가지 범주 중 하나를 선택한 다음 해당 선택 사항을 기록한다는 것입니다. 그러면 주석이 추가되어 적절한 목록에 저장됩니다.
#!/bin/bash
#get the date
date=$(date +%d-%B-%Y)
#save locations
wsave="${HOME}/worknotes.txt"
shsave="${HOME}/shoppingnotes.txt"
scsave="${HOME}/schoolnotes.txt"
#list
while [ true ]
do
read -p "What is this note for?
Work
School
Shopping
> " topic
case $topic in
"Work" )
read -p "
Note
> " wnote
echo "$date: $wnote" >> "$wsave"
echo "Note saved to $wsave"
break
;;
"Shopping" )
read -p "
Note
> " shnote
echo "$date: $shnote" >> "$shsave"
echo "Note saved to $shsave"
break
;;
"School" )
read -p "
Note
> " scnote
echo "$date: $scnote" >> "$scsave"
echo "Note saved to $scsave"
break
;;
*) echo "Error: Selection was not on list, try again.
"
;;
esac
done
답변1
예, 코드를 개선할 수 있습니다.
select
의 명령문은 bash
메뉴를 표시하는 방법을 제공하고 기본 입력 루프도 제공합니다.
#!/bin/bash
menu=(
Work
School
Shopping
)
PS3='What is this note for? '
while true; do
unset outfile
select word in Exit "${menu[@]}"; do
case $REPLY in
1)
echo 'Bye!'
exit ;;
[2-4])
outfile="$HOME/${word,,}-notes.txt" ;;
*)
echo 'Invalid choice, try again' >&2
esac
if [ -n "$outfile" ]; then
break
fi
done
IFS= read -r -p 'Enter note: '
printf '%s:\t%s\n' "$(date +%d-%B-%Y)" "$REPLY" >>"$outfile"
printf 'Note added to "%s"\n' "$outfile"
done
여기서 또 다른 변형은 실제 주석만 요청한다는 것입니다.하나장소. 이렇게 하면 코드를 더 쉽게 읽고 유지 관리할 수 있습니다.
기분이 나아지면 일련의 진술로 대체될 수 있습니다 case ... esac
. 올바른 선택이 이루어지면 if ... then ... elif ... fi
내부 break
문이 루프에서 벗어납니다. select
그러면 외부 루프로 이동하여 사용자에게 텍스트를 요청하고 이를 파일에 저장한 후 다시 메뉴 표시로 돌아갑니다. 메뉴의 옵션은 Exit
스크립트를 종료하는 방법을 제공합니다.
작은 메모는
while [ true ]
코드에서 동일한 효과가 있습니다
while [ false ]
아니면 실제로
while [ bumblebee ]
[ ... ]
단일 단어가 포함되면 해당 단어가 문자열로 해석되기 때문입니다 . 문자열이 비어 있지 않으면 테스트는 다음과 같습니다.진짜.
내 코드에서는
while true
이것은 실제로true
유틸리티 실행, 항상 다음을 반환합니다.진짜값.