正規表現の周りに二重[[]]
引用符: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拡張正規表現として扱われ、それに応じて一致します。パターンの一部が引用されると、引用された部分は文字通り一致します。これは、引用された部分のすべての文字が特別なパターンマッチングの意味なしにそれ自体でマッチすることを意味します。