
次のループは、数値が1未満または45を超えると繰り返されますが、答えに[%&*#]などの特殊文字が含まれていると失敗します。
この問題をサポートするためにコードで何を変更できますか?
a=1
b=45
while [[ $answer -lt $a ]] || [[ $answer -gt $b ]]
do
echo -n "please answer"
read answer
done
答え1
全体の概念を考え直すこともできます。続行するのに役立つ簡単なスニペットは次のとおりです。
#!/usr/bin/env bash
a=1
b=45
while read -p 'Please answer: ' answer
do
re=$(printf '%s\n' "$answer" | tr -dc '[[:digit:]]')
if ((re < a || re > b)); then
read -p 'Please answer: ' $re
else
echo "Loop ended"
exit
fi
done
答え2
この試み:
#!/bin/bash
#
a=1
b=45
#
while [[ $answer -lt $a || $answer -gt $b ]]; do
read -p "please answer: " answer
answer=$(echo "$answer" | tr -dc '[:alnum:]\n\r')
done
このanswer=$(echo "$answer" | tr -dc '[:alnum:]\n\r')
行は、回答からすべての特殊文字を削除し、変数を新しい値にリセットします。