不提供起始索引时,bash数组切片如何工作?

时间:2019-02-06 15:48:32

标签: arrays bash scripting

我正在查看脚本,但无法确定正在发生的事情。

这里是一个例子:

# Command to get the last 4 occurrences of a pattern in a file
lsCommand="ls /my/directory | grep -i my_pattern | tail -4"

# Load the results of that command into an array
dirArray=($(echo $(eval $lsCommand) | tr ' ' '\n'))

# What is this doing?
yesterdaysFileArray=($(echo ${x[@]::$((${#x[@]} / 2))} | tr ' ' '\n'))

这里发生了很多事情。我了解数组的工作原理,但是我不知道如果从未声明$ x怎么引用它。

我看到$((($ {#x [@]} / 2}}正在将元素数量除以一半,然后使用tr来创建数组。 ?

1 个答案:

答案 0 :(得分:3)

我认为最后一行是格式为bash的{​​{1}}的数组切片模式,其中${array[@]:1:2}返回数组的内容,array[@]占长度的一片2,从索引:1:2开始。

所以对于您的情况,尽管您使用起始索引 empty ,因为您没有指定任何长度,并且长度为数组计数的一半。

但是在1中,有如下更好的方法。不要使用bash并使用外壳程序本身的内置globbing支持

eval

然后做

cd /my/directory 
fileArray=()
for file in *my_pattern*; do
    [[ -f "$file" ]] || { printf '%s\n' 'no file found'; return 1; }
    fileArray+=( "$file" )
done