По умолчанию 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
является системной переменной, и при ее перезаписи может возникнуть много неприятных проблем.