КСФ = ';'читать-массив не разделяется ";"правильно, когда ввод содержит новые строки - PullRequest
0 голосов
/ 28 сентября 2018

Я использую PHP и пытаюсь отправить скрипту оболочки одну строку, содержащую несколько команд, разделенных ";"(и, возможно, перевод строки).

Однако разделение не работает должным образом от IFS.

Мой ввод

"mycommand1 '    hello word \n    ';\nmycommand2 'hello world;\nmycommand3 'bye world;\n"

Но по какой-то причине это только сохранениепервая строка внутри CMDS_ARR

#!/bin/bash

COMMANDS="mycommand1 '    hello word 
    ';
mycommand2 'hello world;
mycommand3 'bye world;
"

# Delimit single-line commands by ";" into multi commands
# array $CMDS_ARR to include all commands as single input
IFS=';' read -ra CMDS_ARR <<< "$COMMANDS"

for CMD in "${CMDS_ARR[@]}"; do
    printf "THE COMMAND: *$CMD*\n"
done

Выход

THE COMMAND: *mycommand1 '    hello word*

1 Ответ

0 голосов
/ 28 сентября 2018

Используйте параметр -d, чтобы установить символ новой строки в нулевой байт, чтобы read рассматривал весь ввод в виде одной строки.

IFS=';' read -d '' -ra CMDS_ARR <<< "$COMMANDS"

Чтобы избежать ненулевого значениявыход из состояния, когда единственной проблемой является отсутствующий нулевой байт для завершения ввода, не используйте строку здесь (которая не может содержать нулевой байт).Один параметр для @CharlesDuffy:

IFS=';' read -d '' -ra cmds_arr < <( printf '%s\0' "$COMMANDS" )

A переменная или жестко запрограммированная строка не может содержать нулевой байт, но вывод printf может.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...