如何将 shell 变量的管道分隔内容作为数组变量的输入

如何将 shell 变量的管道分隔内容作为数组变量的输入

我在将以下变量的数据处理到动态数组时遇到问题

variable_1='A|B|C|D' -> dynamic_array=(A B C D)

我尝试使用 sed 命令来替换 '|'有空间以及如何将数据传递给dynamic_array

他们有什么办法可以在一行代码内实现吗?

答案1

无需改变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") 虽然比较简短,但会在最后一个数组元素处插入一个虚假的换行符,正如 Freddy 指出的那样。

答案2

假设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"

答案3

假设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=''gets array=( '' ), not array=( ))。

相关内容