1

У меня есть что-то вроде этого:

declare -a DISPLAYS
AUXILIAR="$(xrandr | grep " connected ")"
IFS=$'\n' read -ra DISPLAYS <<< "$AUXILIAR"

Почему он не обнаруживает разрывы строк, если

echo "$AUXILIAR" 

Распечатать более одной строки?

ОБНОВИТЬ

Эта работа завершена:

AUXILIAR="$(xrandr | grep " connected " | tr '\n' '%')"
IFS='%' read -ra DISPLAYS <<< $(echo $AUXILIAR)

Я все еще хочу знать, почему это не раскололось в разрыве.

1 ответ1

1

По умолчанию read будет читать только одну строку за раз. Например, здесь мы предлагаем три линии ввода и, как вы можете видеть, read только читает первая строка:

$ IFS=$'\n' read -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a")'

Опция -d может быть использована для изменения этого поведения. Например:

$ IFS=$'\n' read -d '' -ra displays <<< $'a\nb\nc\n'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")

Здесь -d '' был использован. Это говорит read to read, пока не найдет NUL-символ. Поскольку в строке bash никогда не может быть символа NUL, это приводит к тому, что он читает все входные данные, которые мы передаем с помощью строки here.

С помощью %

$ IFS=% read -ra displays <<< 'a%b%c'; declare -p displays
declare -a displays='([0]="a" [1]="b" [2]="c")'

Использование % работает, потому что read продолжает читать после % . По умолчанию он останавливается только для символов новой строки.

Другой

Рекомендуется использовать имена переменных в нижнем или смешанном регистре. Система использует имена в верхнем регистре, и вы не хотите случайно перезаписывать одно из них. Например, DISPLAY является системной переменной, и при ее перезаписи может возникнуть много неприятных проблем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .