Я думал, что следующее сгруппирует выходные данные my_command
в массив строк:
IFS='\n' array_of_lines=$(my_command);
так что это $array_of_lines[1]
будет относиться к первой строке в выводе my_command
, $array_of_lines[2]
ко второй и так далее.
Однако приведенная выше команда, похоже, не работает хорошо. Кажется, он также разделяет вывод my_command
вокруг символа n
, как я уже проверял print -l $array_of_lines
, который, я считаю, печатает элементы массива строка за строкой. Я также проверил это с:
echo $array_of_lines[1]
echo $array_of_lines[2]
...
Во второй попытке я подумал, что добавление eval
может помочь:
IFS='\n' array_of_lines=$(eval my_command);
но я получил тот же результат, что и без него.
Наконец, следуя ответу об элементах List с пробелами в zsh , я также попытался использовать флаги расширения параметров вместо того, IFS
чтобы указывать zsh, как разделить входные данные и собрать элементы в массив, то есть:
array_of_lines=("${(@f)$(my_command)}");
Но я все еще получил тот же результат (расщепление происходит на n
)
С этим у меня есть следующие вопросы:
Q1. Каковы «правильные» способы сбора выходных данных команды в массив строк?
Q2. Как я могу указать IFS
разделить только на новые строки?
Q3. Если я использую флаги расширения параметров, как в моей третьей попытке выше (т. Е. Использую @f
), чтобы указать разбиение, игнорирует ли zsh значение IFS
? Почему это не работает выше?
источник
"${(@f)...}"
так же, как${(f)"..."}
, но по-другому.(@)
внутри двойных кавычек означает «дать одно слово на элемент массива» и(f)
означает «разбить на массив по новой строке». PS: Пожалуйста, ссылку на документы${(f)"..."}
будет пропускать пустые строки,"${(@f)...}"
сохраняет их. Это то же самое различие между$argv
и"$argv[@]"
. Эта"$@"
вещь для сохранения всех элементов массива происходит из оболочки Bourne в конце 70-х годов.Две проблемы: во-первых, очевидно, что двойные кавычки также не интерпретируют обратную косую черту (извините за это :). Используйте
$'...'
цитаты. И, соответственноman zshparam
, чтобы собрать слова в массив, нужно заключить их в скобки. Так что это работает:Я не могу ответить на ваш Q3. Я надеюсь, что мне никогда не придется знать такие эзотерические вещи :).
источник
Вы также можете использовать tr для замены новой строки пробелом:
источник
$IFS
. Перевод одного на другой не имеет значения.echo
, где входные данные представляют собой более или менее кучу слов, разделенных тем, кого это волнует.