#!/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"