이 코드를 개선할 수 있나요?

이 코드를 개선할 수 있나요?

이 부분을 개선하거나 정리할 수 있는지 궁금합니다. 아이디어는 사용자가 세 가지 범주 중 하나를 선택한 다음 해당 선택 사항을 기록한다는 것입니다. 그러면 주석이 추가되어 적절한 목록에 저장됩니다.

#!/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유틸리티 실행, 항상 다음을 반환합니다.진짜값.

관련 정보