文字列を正規表現と比較する

文字列を正規表現と比較する

私は彼らがフォローしていることを確認するためにホスト名を確認したいと思いますBash Shell

ホスト名が次のと仮定します。ab-cde-01

wolf@linux:~$ h='ab-cde-01'
wolf@linux:~$ echo $h
ab-cde-01
wolf@linux:~$ 

私はif elseループを構築することから始め、うまくいきました。

wolf@linux:~$ if [ $h = 'ab-cde-01' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is a valid name
wolf@linux:~$ 

ただし、正規表現を使用して数字を[0-9]に変更しようとすると、無効な名前が表示されます。

wolf@linux:~$ if [ $h = 'ab-cde-0[0-9]' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is an INVALID name
wolf@linux:~$ 

更新1:=〜演算子

=~提案されているように演算子を使用してください...

wolf@linux:~$ if [ $h =~ 'ab-cde-0[0-9]' ]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
bash: [: =~: binary operator expected
ab-cde-01 is an INVALID name
wolf@linux:~$ 

アップデート2:二重括弧

wolf@linux:~$ if [[ $h =~ 'ab-cde-0[0-9]' ]]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is an INVALID name
wolf@linux:~$ 
  1. このコードにはどのような問題がありますか?
  2. どうすれば修正できますか?
  3. これは、特定の基準に基づいてホスト名を解決する正確で効率的な方法ですか?

アップデート3:私の参照のための実際の答え

wolf@linux:~$ if [[ $h =~ ab-cde-0[0-9] ]]; then
> echo $h is a valid name
> else
> echo $h is an INVALID name
> fi
ab-cde-01 is a valid name
wolf@linux:~$ 

教訓を得る

  1. 単一括弧の代わりに二重括弧を使用してください。
  2. 正規表現には引用符はありません。

ベストアンサー1

最後の試みが最も近かったが、まだいくつかの問題があります。

基本的に正規表現を引用したので動作しません。次のようにする必要があります。

MATCH='ab-cde-0[0-9]'
if [[ "$h" =~ $MATCH ]];then

しかし、まだ問題があります。正規表現を固定していないので(与えられた文字列の途中で一致することができることを意味します)、上記はまだh=foo-ab-cde07bar

アンカリングは以下のように行われる。

MATCH='^ab-cde-0[0-9]$'
if [[ "$h" =~ $MATCH ]];then

ただし、この制限された例では正規表現を使用する必要はなく、代わりにグローバルマッチングを使用できます。これはあなたが発表する内容に適しています。

MATCH='ab-cde-0[0-9]'
if [[ "$h" = $MATCH ]];then

$h注:この文字列は良い習慣なので、すべての例で引用しました。

編集:ここで提案されているように、マッチャーを変数として定義します。イルカチョ

おすすめ記事