この部分を改善または整理できるかどうか疑問に思います。アイデアは、ユーザーが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
ユーティリティの実行、常に次を返します。本物値。