Как подать разделенное конвейером -содержимое переменной оболочки в качестве входных данных для переменной массива

Один из файлов запуска вашей оболочки содержит команду, которая не найдена. Сообщение об ошибке указывает, что это команда aliases.. Поскольку это выглядит как конец предложения текст (, а не шелл-код ), я предполагаю, что это произошло из-за случайного удаления символа комментария(#)в какой-то строке файла.

Взгляните на ~/.bash_profileили ~/.bashrcили любой другой файл запуска оболочки, который вы недавно редактировали, и найдите в них строку aliases., это может помочь вам определить проблему.

0
12.11.2020, 11:28
3 ответа

Без изменения IFS, начиная с Bash 4.4:

readarray -td '|' arr < <(printf '%s' "$var")
$ var='A|B|C|D'
$ readarray -td '|' arr < <(printf '%s' "$var")
$ echo "${arr[0]}"; echo "${arr[3]}"
A
D

См. объяснение в help readarray.

Примечание. :Мое предыдущее предложение (readarray -td '|' arr <<< "$var"), хотя и короче, заключалось в том, чтобы вставить ложный перевод строки в последний элемент массива, как указал Фредди.

3
18.03.2021, 22:50

Предполагая zsh, вы можете использовать флаг расширения параметра s, который будет работать с любыми символами или не -символами, содержащимися в элементах:

$ string=$'first element|second\nbinary\x80element\0||second-last|'
$ array=("${(@s[|])string}")
$ typeset -p string array
typeset string=$'first element|second\nbinary\M-\C-@element\C-@||second-last|'
typeset -a array=( 'first element' $'second\nbinary\M-\C-@element\C-@' '' second-last '' )

Обратите внимание, что пустая строка разбивается на один пустой элемент.(string=''дает array=( '' ), а неarray=( )).

0
18.03.2021, 22:50

Если предположитьbash:


Вы можете использовать разбиение на слова. Внутренний разделитель полей (IFS )по умолчанию — пробел, табуляция или новая строка. Но вы можете переопределить его, установив переменную среды IFS, после чего вы можете использовать обычные способы создания переменной :

.
set -f # disable filename expansion
IFS='|' arr=($variable_1)

илиdeclare:

IFS='|' declare -a 'arr=($variable_1)'

илиread:

IFS='|' read -ra arr  <<<  "$variable_1"

Если вы измените переменную IFSтаким образом, вы можете сначала сохранить ее в другой переменной, а затем сбросить:

OLD_IFS="$IFS"
# my commands
IFS="$OLD_IFS"
2
18.03.2021, 22:50

Теги

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