我正在查看脚本,但无法确定正在发生的事情。
这里是一个例子:
# 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来创建数组。 ?
答案 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