#!/bin/bash/
echo "Choose a number between 1 and 100"
read num
num=num
echo
if [ $num -lt 100 -o -gt 1 ]; then
echo "You chose $num"
elif [ $num -gt 100 -o -lt 1 ]; then
echo "you chose a number outside of the boundary"
fi
答え1
POSIX sh 構文を使用します。
#! /bin/sh -
printf 'Choose a decimal integer number between 1 and 100: '
IFS= read -r num
die() {
printf >&2 '%s\n' "$@"
exit 1
}
case $num in
("" | - | *[!0123456789-]* | ?*-*)
die "$num is not a valid decimal integer number";;
(*[123456789]??*)
die "You chose a number outside the boundaries"
esac
if [ "$num" -lt 1 ] || [ "$num" -gt 100 ]; then
die "You chose a number outside the boundaries"
fi
echo "You chose $num"
- 数字あいまいだ
0xAA
、、、、、、はすべてMMXVIII
特定の¾
定義による数値です010
。1.4e+4
infinity
数字。とりわけ、POSIXに似た多くのシェルは組み込みのbash
10進整数のみをサポートします[
(算術式では10進数、8進数、16進数)。正確にどのタイプの番号が欲しいかを確認するのが最善です。ここでは10進整数を例に挙げます。 - 算術式にランダムな文字列を使用し、コマンドに特定
[
のシェルを使用することは、コマンド注入の脆弱性です。。したがって、入力した数字が数字のように見えることを最初に確認する必要があります。 IFS= read -r line
入力行を読み取る構文です。(ここで$IFS
- ストリッピングと行の連続処理はread num
問題ありませんが)。- パラメータ拡張は、Bourneなどのシェルから引用する必要があります。
- ロジックに問題があります。使ってみましたか?または変えるそしてオペレーター。すべての10進数は1より大きいまたは100未満。
-o
演算子は、-a
[
安定して解釈できないテスト式を生成するため、使用されなくなりました。ここで引数が10進整数であることを確認することは問題ありませんので、使用しない方が最善です。または、シェル演算子[
で区切られた複数の呼び出しを使用するのが最善です。&&
||
- stderr()にエラーメッセージを印刷し
>&2
、失敗した場合はゼロ以外の終了状態で終了することをお勧めします。 - ほとんどのシェルは、コンパイラのデフォルトの整数データ型を整数演算子として使用します。ほとんどのシステムにあるシェルの場合、たとえば2 64 +50(18446744073709551666)は、この内部表現と比較して大きすぎます。シェルの
[
実装によっては、数字として認識されない(bash、dash、yash)、警告とともに19桁に切り捨て(zsh)、floatで近似(ksh93)、ラップされている(次のように処理されます)。 50) (mksh).したがって、[ 18446744073709551666 -gt 0 ]
falseを返すか[ 18446744073709551666 -le 100 ]
trueを返すことがわかります。したがって、*[123456789]??*
数字が3桁以上であることを確認してください。 - ユーザーが入力の一部としてNUL文字を入力すると、他のシェルは動作が異なります。
具体的には、bash
次のようにすると少しぎこちなくなります。
#! /bin/bash -
IFS= read -rp 'Choose a decimal integer number between 1 and 100: ' num
die() {
printf >&2 '%s\n' "$@"
exit 1
}
[[ $num =~ ^-?[0123456789]+$ ]] ||
die "$num is not a valid decimal integer number"
[[ $num = *[123456789]??* ]] ||
((num < 1 || num > 100)) &&
die "You chose a number outside the boundaries"
echo "You chose $num"
答え2
シェルを使用してテストします。
#!/bin/bash
read -rp "Choose a number between 1 and 100: " num
echo
if [ "$num" -le 100 -a "$num" -ge 1 ]; then
echo "You chose $num"
else
echo "you chose a number outside of the boundary"
fi
Bash 拡張を使用してテストします。
#!/bin/bash
read -rp "Choose a number between 1 and 100: " num
echo
if [[ "$num" -le 100 && "$num" -ge 1 ]]; then
echo "You chose $num"
else
echo "you chose a number outside of the boundary"
fi
シェル操作の使用:
#!/bin/bash
read -rp "Choose a number between 1 and 100: " num
echo
if ((num<=100 && num>=1)); then
echo "You chose $num"
else
echo "you chose a number outside of the boundary"
fi
注:現在-o
使用中またはしかし、あなたは-a
欲しいと思います。そして。あるいは、条件だけを渡す必要があるため、数字は-1または101にすることができます。
また、右辺は-o
まったく新しいテストと同じであるため、その側の変数を再導入する必要があります。また、数字が最初のテストに失敗した場合は、別のテストを実行する必要がないため、ドアのelse
代わりに使用します。elif
答え3
下の2行目は致命的なタイプミス(おそらくnum="$num"
)ですが、そうであればその行は不要です。
read num
num=num
ユーザーが数字を入力した場合「1」、2行目は数値ではなく文字列に変更します。「数字」。これにより、以降のすべての数値制限の確認が中断されます。
この問題を解決するには、2 行目を削除します。