POSIX перехватывает новую строку в операторе case

Во время установки используется значение по умолчанию Minimal, которое не имеет графического интерфейса. Вам нужно выбрать Server With GUIв главном меню установки, чтобы появился графический интерфейс.

9
31.10.2019, 16:01
2 ответа

В оболочке dashнет строк C -($'...'). Строки C -являются расширением стандарта POSIX. Вам придется использовать буквальную новую строку. Это проще (и выглядит лучше ), если вы сохраняете новую строку в переменной:

#!/bin/dash

nl='
'

for string; do

    case $string in
        *"$nl"*)
            printf '"%s" contains newline\n' "$string"
            ;;
        *)
            printf '"%s" does not contain newline\n' "$string"
    esac

done

Для каждого аргумента командной строки, переданного сценарию, это определяет, содержит ли он новую строку или нет. Переменная, используемая в операторе case($string), не нуждается в заключении в кавычки, а ;;после последней метки caseне требуется.

Тестирование (из интерактивной zshоболочки, из которой исходит дополнительное приглашение dquote>):

$ dash script.sh "hello world" "hello
dquote> world"
"hello world" does not contain newline
"hello
world" contains newline
14
27.01.2020, 20:06

Вы можете включить символ новой строки (в кавычки )в качестве шаблона, точно так же, как вы делали это при назначении переменной:

q='
'
case "$q" in
    *'
'*) echo nl;;
    *) echo NO nl;;
esac

Это делает форматирование некрасивым, (вы не можете делать отступ в конце кавычек ), но должны быть полностью переносимыми. Я тестировал в bash, zsh, ksh и dash.

2
27.01.2020, 20:06

Теги

Похожие вопросы