我有一个由 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 。 有人能指出我正确的方向吗?非常感谢任何帮助。
(...)
不是数组文字;它是赋值本身语法的一部分。
鉴于输出是空格分隔的整数字符串,您可以设置 shell 的普通字段分割来生成要添加到数组中的整数集。
bla=( $(grep -n "vfV" Programming/SITEhtml.txt | awk '{print $1}' | sed 's/:/ /' | tr -d '\n\r') )
由于问题的标题相当通用,我认为基本答案会非常有用。无需使用具有
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]