如何在 zsh 中正确初始化数组

问题描述 投票:0回答:2

我有一个由 4 位整数组成的文本文件,用空格分隔,代表另一个文件的行号。 加载名为“bla”的数组,然后尝试打印该数组的索引后,我发现索引是组成数组的各个“字符”。

┌──(s)-[~]
└─$ bla=$(grep -n "vfV" Programming/SITEhtml.txt | awk '{print $1}' | sed 's/:/ /' | tr -d '\n\r' | awk '{print "("$0")"}')  
                                                                                                                                                                                                                                            
┌──(s)-[~]
└─$ echo $bla[@]
(2929 2998 3067 3136 3205 3274 3343 3412 3481 3550 3619 3688 3757 3826 3895 3964 4033 4102 4171 )
                                                                                                                                                                                                                                            
┌──(s)-[~]
└─$ echo $bla[1]
(
                                                                                                                                                                                                                                            
┌──(s)-[~]
└─$ echo $bla[10]
8

When I load the array from the CLI instead of the script, I am able to access the indexes properly as shown below.

┌──(s)-[~]
└─$ bla=(2929 2998 3067 3136 3205 3274 3343 3412)                                                                                                                                                                                
                                                                                                                                                                                                                                            
┌──(s)-[~]
└─$ echo $bla[5]                                 
3205

我最初使用“bla=$(cat FILE)”来加载数组,当失败时,我尝试了其他几个打印命令,但都以同样的方式失败。我相信 zsh 中不存在 mapfile 和 readarray 。 有人能指出我正确的方向吗?非常感谢任何帮助。

arrays indexing zsh
2个回答
0
投票

(...)
不是数组文字;它是赋值本身语法的一部分。

鉴于输出是空格分隔的整数字符串,您可以设置 shell 的普通字段分割来生成要添加到数组中的整数集。

bla=( $(grep -n "vfV" Programming/SITEhtml.txt | awk '{print $1}' | sed 's/:/ /' | tr -d '\n\r')  )
    

0
投票

由于问题的标题相当通用,我认为基本答案会非常有用。无需使用具有

grep
awk
sed
tr
的管道。

在 zsh 中初始化数组(从命令行)的正确方法确实是:

arr=(2929 2998 3067 3136 3205 3274)
echo arr: $arr
echo Type: ${(t)arr} Length: $#arr
echo 'arr[5]': $arr[5]

结果将是:

2929 2998 3067 3136 3205 3274
Type: array Length: 6
arr[5]: 3205

但是,您在文本文件中有一个单行,例如

2929 2998 3067 3136 3205 3274
。首先:让我们将该文本文件读入标量(字符串)变量。

bla=$(<file.txt)
echo bla: $bla
echo Type: ${(t)bla} Length: $#bla

给予:

bla: 2929 2998 3067 3136 3205 3274
Type: scalar Length: 29

有多种方法可以将空白处的标量拆分为数组。我比较喜欢的是:

arr=(${=bla})
echo $arr
echo Type: ${(t)arr} Length: $#arr
echo 'arr[5]': $arr[5]

给予:

2929 2998 3067 3136 3205 3274
Type: array Length: 6
arr[5]: 3205

所以这应该是回答问题的最直观的方式。当然,也可以通过一个嵌套命令来实现:

numbers=(${=$(<file.txt)})
echo numbers: $numbers
echo Type: ${(t)numbers} Length: $#numbers
echo 'numbers[5]': $numbers[5]
© www.soinside.com 2019 - 2024. All rights reserved.