このコードを改善できますか?

このコードを改善できますか?

この部分を改善または整理できるかどうか疑問に思います。アイデアは、ユーザーが3つのカテゴリのいずれかを選択し、その選択を記録することです。これにより、コメントが追加され、適切なリストに保存されます。

#!/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ユーティリティの実行、常に次を返します。本物値。

関連情報