1

d は、私が使用する内部サーバー検索ツールです。

ユーザーが 0 (または 1) から 9999 (このユーザー入力と呼びましょう) までの任意の数値を入力できるようにして、次の結果を表示できるようにしようとしています。

d $userinput (例: 1234)

次に、そのルックアップの結果を操作します (以下では、後で ping を実行するために IP アドレス以外はすべて削除します)。

 grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'`

while true を使用する必要があることはわかっています。$blah などを読んでください。適切にフォーマットするのに十分なだけの読み取りに慣れていないだけでなく、さらに重要なことです。

0 ~ 9999 の数値入力を求めるプロンプトを表示する

4

4 に答える 4

2

他の回答には、ユーザーが希望する範囲外の数値を入力しなかったことを確認するため、多くの欠陥があります。しかし、ユーザーが数字以外の何かを入力した場合はどうなるでしょうか? 彼らの戦略は最初から破られています。

代わりに、ユーザーが必要な範囲内にある数値を入力したことが確実な場合にのみ、手放すことをお勧めします。

while :; do
    read -ep 'Enter server number: ' number
    [[ $number =~ ^[[:digit:]]+$ ]] || continue
    (( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || continue
    # Here I'm sure that number is a valid number in the range 0..9999
    # So let's break the infinite loop!
    break
done

正規表現[[ $number =~ ^[[:digit:]]+$ ]]は、ユーザーが数字のみを入力したことを確認します。

不器用な(number=(10#$number))部分はここにあり、ユーザーが で始まる数字を入力すると0、bash はそれを基数で解釈しようとし8、間違った結果 (たとえば、ユーザーがを入力010した場合) を取得し、場合によってはエラーさえ取得します。たとえば、ユーザーが入力します09(このガードなしで試してください)。


プロンプトを 1 回だけ表示して、ユーザーが無効な用語を入力したときに終了する場合は、次のロジックがあります。

read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] || exit 1
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || exit 1
# Here I'm sure that number is a valid number in the range 0..9999

スクリプトが終了した理由をユーザーに説明したい場合は、die 関数を次のように使用できます。

die() {
    (($#)) && printf >&2 '%s\n' "$@"
    exit 1
}
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] ||
    die '*** Error: you should have entered a number'
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) ||
    die '*** Error, number not in range 0..9999'
# Here I'm sure that number is a valid number in the range 0..9999
于 2014-04-22T17:49:44.497 に答える
1

<-編集->

プロンプトのメカニズムだけが必要な場合は、次のことを試してください。

echo -n "Enter server number:"
read userinput

次に、次のように入力に対して検証チェックを実行します。

if [[ $userinput -lt 0 || $userinput -gt 9999 ]]   # checks that the input is within the desired range
 then
  echo "Input outside acceptable range."
else
  # insert your grep and ping stuff here
fi

<-編集終了->

最初に読んだとき、私はあなたの問題がラッパースクリプトにとって理想的に聞こえると思ったので、これを提案するつもりでした:

$ cat wrapper.sh
#!/usr/bin/bash

userinput=$1

if [[ $# != 1 ]]   # checks that number of inputs is exactly one
 then
  echo "Too many inputs."
  exit 2
elif [[ $userinput -lt 0 || $userinput -gt 9999 ]]   # checks that the input is within the desired range
 then
  echo "Input outside acceptable range."
  exit 3
fi

output=`d "$userinput"`

ping_address=`grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' <("$output")`

ping "$ping_address"

次に、次のようにスクリプトを呼び出します。

$ wrapper.sh 1243
于 2013-01-17T15:31:28.287 に答える
1

2 つの値の間の数値だけが必要な場合は、それらの値をテストできます。

 read x
 while [[ $x -lt 0 || $x -gt 9999 ]]; do
    echo "bad value for x"
    read x
 done
 echo "x=$x"
于 2013-01-17T15:20:20.770 に答える
0

コマンド自体はreadプロンプトを表示しません。echo実際にプロンプ​​トを表示するには、通常の before を使用します。echo -n改行を追加しない場合に使用します。

于 2013-01-17T15:18:34.387 に答える