1から100までの数字を表示し、数字が範囲外であるかどうかを表示する方法は? [閉鎖]

1から100までの数字を表示し、数字が範囲外であるかどうかを表示する方法は? [閉鎖]
#!/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特定の¾定義による数値です0101.4e+4infinity数字。とりわけ、POSIXに似た多くのシェルは組み込みのbash10進整数のみをサポートします[(算術式では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"

おすすめ記事