bashのwhileループ条件を否定する


25

私が取り組んでいるスクリプトの一部では、入力したIPアドレスが正しい形式であることを検証したいと思います。入力形式が正しくないときにループを作成したい。以下は、フォーマットが正しい間、ループに対して機能します。

while  [[  $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
      do

どうすればこのフォーマットに適合しないと言えますか。私は期待していた!=~仕事だろうが、私は構文エラーを取得しています。


2
Synner、注意点の1つ:インタラクティブスクリプトを作成していることは明らかですが、シェルスクリプトの非常に強力な機能は、インタラクティブとバッチモードの両方で同じスクリプトを使用して同じことを実行できることです。将来(スクリプトをビルディングブロックとして使用し始める場合)コマンドラインにオプションを入力し、何か問題があればゼロ以外の終了コード(およびメッセージ)ですぐに戻ることは間違いなく簡単です。ちょうど私の2セント...
鹿ハンター

回答:


60

解決策はとても簡単です、あなたはすべてあなたがそれを面白いと思うと確信しています。

否定構文の詳細について作業する必要はありません。until代わりに使用してくださいwhile


9

文字列の比較には、の!=代わりに使用する必要があります!=~

から man bash

string1 != string2
          True if the strings are not equal.

右側の正規表現を使用しているため、実際に必要=~です。式全体を無効にすることを選択できます。

while  [[  !( $range =~ ^[0-9]{1,3]}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]

例:

$ bash --version | head -n1
GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)
$ cat script
range='1'; while [[ !( $range =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ) ]]; do echo "$range NOT OK"; range+='.2'; sleep 1; done
echo "Finished"
$ bash script
1 NOT OK
1.2 NOT OK
1.2.2 NOT OK
Finished
$ 

迅速な対応ありがとうございます。投稿する前に試しましたが、適切に検証されません。〜が適切に機能するためには、フォーマットに適合することを検証する必要があるようです。
Synner

@Synner編集をチェック
Bernhard

bash4.2.42 では機能しません。pastebin.com/0vHh5MMB
manatwork

1
@manatwork非対話型シェルで試してください。
ベルンハルト

@manatwork私の編集を参照してください
ベルンハルト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.