4

here で説明されているように、「印刷可能な文字」文字クラスをテストするために次のスクリプトを作成しました。

#!/bin/sh

case "foo" in
    *[:print:]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac

このスクリプトが出力することを期待していますfound a printable character。少なくとも 1 つ (実際にはすべて) の文字"foo"が印刷可能です。代わりに、出力します"found no printable characters""foo"の文字が印刷可能な文字として認識されないのはなぜですか?

4

1 に答える 1

8

文字列はブラケット式の[:でのみ特別であり、ブラケット式自体は によって導入されます。したがって、あなたの例は次のようになります。 [

case "foo" in
    *[[:print:]]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac

これが面倒に思える場合は、たとえば、大文字ではなく小文字または数字に一致するパターンを指定する方法を考えてみてください。

詳細については、POSIX 仕様の正規表現での括弧表現の詳細を示すセクションを参照してください。!シェル パターンのブラケット式は、との処理を​​除いて、正規表現のブラケット式と似てい^ます。(ただし、ブラケット式のコンテキスト外で、シェル パターンと正規表現の間には他にも違いがあります)。

于 2012-04-17T00:19:51.650 に答える