Bash [[ パターンマッチングが機能しません。

Bash [[ パターンマッチングが機能しません。

これ条件付き構成の Bash リファレンス・セクション説明する:

When the ‘==’ and ‘!=’ operators are used, the string to the right of the 
operator is considered a pattern and matched according to the rules described 
below in Pattern Matching, as if the extglob shell option were enabled. ...
An additional binary operator, ‘=~’, is available, with the same precedence as 
‘==’ and ‘!=’. When it is used, the string to the right of the operator is 
considered an extended regular expression and matched accordingly (as in regex 
3)). 

しかし、私はこれを試しました。

$ [[ -good == -* ]] ; echo $?
0
$ [[ -g == -* ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-*'
$ [[ -g == -? ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-?'

次に、正規表現一致演算子を試してみます=~

$ [[ -good =~ -.* ]] ; echo $?
0
$ [[ -g =~ -.* ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-.*'
$ [[ -g =~ -.? ]] ; echo $?
bash: syntax error in conditional expression
bash: syntax error near `-.?'

構文エラーが発生するのはなぜですか?

ベストアンサー1

==まあ、注意してください。それ以外の場合、左側のテキストはそのような内容では=~ありません。!=Bash条件式で認識される演算子

あなたの場合はbitsetを-gテストしてくださいsetgid。このコンテキストで演算子として認識されない項目を指定すると機能します。

$ [[ -i == -* ]] ; echo $?
0
$ [[ -i == -? ]] ; echo $?
0
$ [[ -i =~ -.* ]] ; echo $?
0
$ [[ -i =~ -.? ]] ; echo $?
0

文字列を確実に提供する1つの方法は、文字列を引用して演算子として認識するのではなく、文字列としてのみ認識することです。

$ [[ "-good" == -* ]] ; echo $?
0
$ [[ "-g" == -* ]] ; echo $?
0
$ [[ "-g" == -? ]] ; echo $?
0
$ [[ "-good" =~ -.* ]] ; echo $?
0
$ [[ "-g" =~ -.* ]] ; echo $?
0
$ [[ "-g" =~ -.? ]] ; echo $?
0

ただし、引用しないように注意してください。演算子を使用すると、パターンとして認識されません。

$ [[ "-good" == "-*" ]] ; echo $?
1
$ [[ "-g" == "-*" ]] ; echo $?
1
$ [[ "-g" == "-?" ]] ; echo $?
1
$ [[ "-good" =~ "-.*" ]] ; echo $?
1
$ [[ "-g" =~ "-.*" ]] ; echo $?
1
$ [[ "-g" =~ "-.?" ]] ; echo $?
1

おすすめ記事