アプリ版:「スタンプのみでお礼する」機能のリリースについて

シェルスクリプトでのif [ 条件式 ] と if [[ 条件式 ]] の違いについて教えてください。
以下のシェルスクリプトを実行すると、
意図したとおり、111 と出力されます。

=========▼▼(ここから)▼▼=========
#!/bin/sh

AAA=yes
if [[ "$AAA" = [yY]* ]]
then
echo 111
else
echo 222
fi
=========▲▲(ここまで)▲▲=========

上記、スクリプト3行目の
if [[ "$AAA" = [yY]* ]]
の部分を
if [ "$AAA" = [yY]* ]
というように、角カッコ 1重にすると、
エラーは発生しませんが、
222と表示されます。

if [ 条件式 ] と if [[ 条件式 ]] の違いについて教えていただけないでしょうか。

A 回答 (1件)

この書き方だと、Bsh系(bash,ksh,zsh等)ということでよいですね?



[はtestコマンドの別名です。testコマンドは単独のコマンドです。
[[ は(forやif等と同種の)複合コマンドです。

http://linuxjm.sourceforge.jp/html/GNU_bash/man1 …
> [[ expression ]]
> == 演算子と != 演算子が使われたとき、 演算子の右の文字列はパターンと解釈され、 後述のパターンマッチングで説明する規則に従ってマッチングが行われます

http://linuxjm.sourceforge.jp/html/GNU_coreutils …
> STRING1 = STRING2
> 両方の文字列が等しい

とあるように、[[ではパターンマッチングが行われ、[では単純な文字列比較となります。

[[ では、Yesは 「yまたはYではじまる」というパターンに一致するので 0が返る → thenの方を実行
[では Yesと [Yy]* という文字列は一致しないので 1が返る → elseを実行
となります。


疑問があったら、まずはマニュアルを読みましょう。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!