次の変数を設定します
status=ok
echo $status
ok
今、正規表現の変数が一致することを確認したいと思います。
次のように
[[ $status =~ [OK] ]] && echo "is the same"
[[ $status =~ OK ]] && echo "is the same"
[[ $status =~ "OK" ]] && echo "is the same"
しかし、上記のいずれも「同じ」と印刷されません。
私の正規表現にはどんな問題がありますか?
答え1
[OK]
角かっこ内のすべての文字と一致しますが、角かっこは大文字と小文字を区別しないという意味ではありません。
次のことができます。
[[ "$status" =~ ^[Oo][Kk]$ ]]
または、次のようにすることもできます。
[[ "${status,,}" == ok ]]
引数拡散演算子は、,,
比較目的で変数全体を小文字に変換します。
答え2
[[ $status =~ OK ]]
(または[[ $status =~ "OK" ]]
)一致する場合$status
含む OK
、次のよう[[ $status =~ [OK] ]]
な場合含むセットの文字OK
なので、O
またはK
。
^
正規表現の場合、または$
以下を使用する必要があります。アンカートピック内で一致するのではなく、トピック全体を一致させるには、トピックの最初と最後にそれぞれパターンを使用します。
で大文字と小文字を区別しない一致を実行するには、bash
次のnocasematch
オプションを使用できます。
これは[[ $var = pattern ]]
Kornスタイルや標準case $var in (pattern)
に一致するシェルパターンと[[ $var =~ regexp ]]
。
ここでは、次のことができます。
shopt -s nocasematch
[[ $status = ok ]] && echo yes
[[ $status =~ ^ok$ ]] && echo yes
case $status in
(ok) echo yes
esac
nocasematch
(これを維持すると、すべてのパターンマッチング操作に影響を与え、後で設定を解除したり、以前の値にリセットしたりできます(typeset restore="$(shopt -p nocasematch)"
保存とeval "$restore"
復元を参照)。
または、次のものを使用できます。
[[ $status = [oO][kK] ]] && echo yes
[[ $status =~ ^[oO][kK]$ ]] && echo yes
case $status in
([oO][kK]) echo yes
esac
case $status in
(ok | OK | Ok | oK) echo yes
esac
デフォルトのバリエーションはcase
標準のPOSIXsh
構文です。
シェルでグローバルオプションをグローバルに設定する代わりに(そしてすべてのパターンマッチングを中断するのではなく)、zsh
拡張ワイルドカードまたはPCRE正規表現演算子を使用して、単一パターンまたは単一パターンシンボルの一部に対して大文字と小文字を区別しない一致を選択的に有効にすることができますnocasematch
例えば、
set -o extendedglob
[[ $status = (#i)ok ]]
または:
zmodload zsh/pcre
[[ $status -pcre-match '^(?i)ok$' ]]
bash
またはsと同等の場合は、à la cshまたは以下を${var,,}
使用してください。$var:l
${(L)var}
[ "$status:l" = ok ]
では、Bourneではなくほとんどのシェル(少なくともcsh、tcsh、rc、es、fish)など、前のコマンドの終了状態をBourneスタイルのエイリアスとして保持するasという変数をzsh
使用しないでください。$status
$?
Kornシェルのksh93バリアント([[...]]
bashとzshの両方からコピーされます)では[[ $status = ~(i)ok ]]
。
答え3
次のようにパターンマッチングを実行できます。
[[ $status == @(ok|OK|okay) ]] && echo "is the same"
あるいは、以前の投稿のjesse_bのアイデアと同様に、パラメータ^^
拡張演算子は比較の目的で変数全体を大文字に変換します。
[[ "${status^^}" == OK ]] && echo "is the same"