Bashのテスト番号

Bashのテスト番号

正規表現の周りに二重[[]]引用符:digit:と一重引用符を使用して数字をテストする正しい方法ですか?

if [[ "$var" =~ '^[[:digit:]]+$' ]]; then

ベストアンサー1

これは事実ではなく、簡単なテストで次のことを確認できます。

#!/bin/bash

for var in 1 2 3 a b c; do
  if [[ "$var" =~ '^[[:digit:]]+$' ]]; then
    echo "$var is a number"
  else
    echo "$var is NOT a number"
  fi
done

上記のコマンドを実行すると、次のようになります。

1 is NOT a number
2 is NOT a number
3 is NOT a number
a is NOT a number
b is NOT a number
c is NOT a number

自動的に実行されるエディタがある場合、またはshellcheckコードを貼り付ける場合https://shellcheck.net/、次のエラーが表示されます。

Line 4:
        if [[ "$var" =~ '^[[:digit:]]+$' ]]; then
                        ^-- SC2076 (warning): Remove quotes from right-hand side of =~ to match as a regex rather than literally.

これにより、次のように書く必要があることがわかります。

#!/bin/bash

for var in 1 2 3 a b c; do
    if [[ "$var" =~ ^[[:digit:]]+$ ]]; then
        echo "$var is a number"
    else
        echo "$var is NOT a number"
    fi
done

次を生成します。

1 is a number
2 is a number
3 is a number
a is NOT a number
b is NOT a number
c is NOT a number

この内容は次のように記録されます。バッシュのマニュアルページ:

==と!=と同じ優先順位を持つ追加の2項演算子=~を使用することもできます。使用すると、演算子の右側の文字列はPOSIX拡張正規表現として扱われ、それに応じて一致します。パターンの一部が引用されると、引用された部分は文字通り一致します。これは、引用された部分のすべての文字が特別なパターンマッチングの意味なしにそれ自体でマッチすることを意味します。

おすすめ記事