まだ新しいバージョン
関数として:
ask4nameIp() {
unset ip name
local var v1 v2 v3 v4
while ! [ "$name" ] || ! [ "$ip" ]; do
printf "Name: %s\r" $name
read -p Name:\ var
[ "$var" ] && name=${var// /_}
printf "IP: %s\r" $ip
IFS=. read -p IP:\ v{1..5}
((${#v1}*${#v2}*${#v3}*${#v4})) &&
[ -z "${v1//[0-9]}${v2//[0-9]}${v3//[0-9]}${v4//[0-9]}$v5" ] &&
((0<=v1&&v1<=255&&0<=v2&&v2<=255&&0<=v3&&v3<=255&&0<=v4&&v4<=255)) &&
ip=$v1.$v2.$v3.$v4
[ "$name" ] && [ "$ip" ] ||
echo something wrong: ${name:-name missing} ${ip:-ip missing}...;
done;
printf "Name: '%s'\nIP: '%s'\n" $name $ip
}
変数$name
であり$ip
、関数の外で使用できます:
$ ask4nameIp ; declare -p name ip
Name: foo bar 23
IP: 10.123.45.67
Name: 'foo_bar_23'
IP: '10.123.45.67'
declare -- name="foo_bar_23"
declare -- ip="10.123.45.67"
問題がなくなるまでループする完全な手順
次のようなもの: (完全な bash ! パイプなし、外部 tr、awk、sed なし ...) スクリプト ファイルに書き込む必要なく、bash コンソールでカット アンド パストを使用してテストできます。
unset name ip; \
while ! [ "$name" ] || ! [ "$ip" ];do
printf "Name: %s\r" $name;
read -p Name:\ var;
[ "$var" ] && name=${var// /_};
printf "IP: %s\r" $ip;
read -p IP:\ var;
iparray=($( IFS=".";echo $var;));
[ ${#iparray[@]} -eq 4 ] && \
[ $iparray -ge 0 ] && [ $iparray -le 255 ] && \
[ ${iparray[1]} -ge 0 ] && [ ${iparray[1]} -le 255 ] && \
[ ${iparray[2]} -ge 0 ] && [ ${iparray[2]} -le 255 ] && \
[ ${iparray[3]} -ge 0 ] && [ ${iparray[3]} -le 255 ] && \
ip=$var;
[ "$name" ] && [ "$ip" ] || echo something wrong...;
done; \
printf "Name: '%s'\nIP: '%s'\n" $name $ip
これは、bash の正規表現を使用するよりも強力に見えますが、実際に使用すると、はるかに軽量です。
使用中、これにより、すでに定義されている変数をデフォルトとしてすべてのリクエストが表示され、すべての変数が定義されるまでループします。
unset
必要なすべての変数
- 必要なすべての変数が定義されるまでのメインループ
print
request とすでに定義されている変数 (デフォルトとして\r
) を使用し、代わりに使用して同じ行にとどまります\n
- プロンプト要求と
read
回答用 (要求は、同じ場所で、前の行でプロンプトが表示されたものに上書きされます)。
- スペースをアンダースコアに置き換え、
name
何かがあるかどうかを定義します
- プロンプト リクエストとanserよりも、
name
変数:リクエスト + 定義済みの操作を繰り返します。print
read
- IP の整数を分割するために一時配列を使用する
iparray
- チェック: 整数の数 == 4 で、すべてが 0 から 255 までの整数である場合、 を割り当て
IP
ます。
echo
すべての変数が定義されていない場合、エラー メッセージが表示されます。
- ループ
- 結果を印刷する
