我有一个包含子目录和文件的数组:
~$ array=(elem1/a elem1/b elem2/a elem2/b)
我需要选择子目录中的所有文件(及其子目录)elem1.
我尝试过for循环和case:
for element in "${array[@]}"; do
case $element in
elem1*)
# action I need to perform on this element
echo "This is $element"
;;
esac
done
我想使用一些 glob 来获取所需的元素列表,其方式与此类似(从数组元素中减去子字符串):
~$ echo ${array[@]%/a}
elem1 elem1/b elem2 elem2/b
我主要担心的是,我不应该对我正在搜索的字符串进行硬编码,因为我不知道它的内容 - 在这个脚本的最终版本中,我从另一个数组中获取它们。
我的答案将数组的每个元素打印在不同的行中,然后过滤您感兴趣的元素(grep
)并将它们放入一个新数组中
newarray=( $(printf "%s\n" "${array[@]}" | grep ^elem/) )
唯一的问题是数组的元素(子目录和文件名)可能包含EOL或空白字符。
Bonus
如果你的元素包含EOL或空白字符,您应该使用NUL (\000
) 字符和grep -zZ
去处理它;但随后您需要更多代码将这些 NULL 字符字符串转换为 bash 可以使用的内容——当 bash 找到 NULL 字符时,它会停止读取。
在这个例子中我使用awk
,处理 NUL 字符没有问题,并且不需要使用grep
:
eval newarray=( $(printf "%s\000" "${A[@]}" |
awk 'BEGIN { FS="\000" }
/^elem\// {
gsub("\042","\\\042")
printf("[" NR-1 "]=\042%s\042 ",$0)
}'
)
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)