2012-04-17 4 views
4

Я написал следующий скрипт, чтобы проверить класс символов «печатные символы», как описано here.Почему класс POSIX «печатные символы» не соответствует простой строке?

#!/bin/sh 

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

Я ожидаю, что этот скрипт для вывода found a printable character, по крайней мере, один (на самом деле, все) символы в "foo" печатаемые. Вместо этого он выводит "found no printable characters". Почему символы в "foo" не распознаются как печатные символы?

ответ

8

Строка [: только специальная внутри выражения скобки и выражения скобки сами введены [. Так что ваш пример должен быть:

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

Если это кажется громоздким, подумайте о том, например, как бы вы указать шаблон, который должен соответствовать строчную букву или цифру, но не прописной буквы.

Для получения дополнительной информации см. section of the POSIX spec detailing bracket expressions in regular expressions. Выражения скобок в шаблонах оболочки аналогичны выражениям скобок в регулярных выражениях, за исключением обработки ! и ^. (Хотя в противном случае существуют другие различия между шаблонами оболочки и регулярными выражениями, вне контекста выражений скобок).