Arrays BASH-在数组中查找正则表达式,打印找到的数组项
我在这里测试了正则表达式: 我无法让数组只打印正则表达式搜索词Arrays BASH-在数组中查找正则表达式,打印找到的数组项,arrays,regex,bash,Arrays,Regex,Bash,我在这里测试了正则表达式: 我无法让数组只打印正则表达式搜索词 files=(`ls $BACKUPDIR`) daterange='(2015\-06\-)[0-9]+\s?' for i in "${files[@]}" do if [[ "$files[$i]" =~ $daterange ]]; then echo $i fi done 输入:2015-06-06 2015-06-13 2015-
files=(`ls $BACKUPDIR`)
daterange='(2015\-06\-)[0-9]+\s?'
for i in "${files[@]}"
do
if [[ "$files[$i]" =~ $daterange ]];
then
echo $i
fi
done
输入:2015-06-06 2015-06-13 2015-06-20 2015-06-27 2015-07-04 2015-07-11
输出:
2015-06-06
2015-06-13
2015-06-20
2015-06-27
2015-07-04
2015-07-11
通过运行
bash-vx
我发现它正在编译的文件是错误的。我需要将$files[$I]
更改为$I
$files[$i]
=2015-06-06[2015-06-06]
由于Etan Reisner的评论,我进一步改进了我的答案。不解析来自ls
的输出
参考:
您可以尝试使用
bash-vx
执行脚本,以查看如何计算值。这可能会揭示出问题所在。您忘记了$files[$i]
中的{}
。试试${files[$i]}
@anubhava我已经添加了输入。我已经解决了我的问题,多亏了你们,你们不应该这样。改为在该数组中使用glob(这可能意味着可能需要剥离循环中的路径,但是basename
可以为您这样做)。我已经更新了我的答案,谢谢@EtanReisner。有人知道这是什么吗?“[[-d”$i”]]”,我在谷歌上找不到任何东西。[[
是特定于bash的[
/test
版本,语义稍有不同。-d
是“是一个目录”。注意,在原始版本中它是[-d”$folder]&&echo“$folder”
,就是这样“如果$folder是一个目录,则回显$folder”。它自己[[-d“$folder”]]
只返回true或false,因此在您的代码中它不起任何作用。谢谢兄弟,在我的场景中,我看不到它在这里的用途?按您的方式编写,正如我所说,它没有任何用途,因为它只返回true或false,并且不影响或打印任何内容。在原始的&
中,它只会在它返回true(即文件夹是一个目录)。
#!/bin/bash
# Enable special handling to prevent expansion to a
# literal '/example/backups/*' when no matches are found.
shopt -s nullglob
# Variables
YEAR=`date +%Y`
MONTH=`date +%m`
DIR=(/home/user/backups/backup.weekly/*)
# REGEX - Get curent month
DATE_RANGE='('$YEAR'\-'$MONTH'\-)[0-9]+\s?'
# Loop through dir
for i in "${DIR[@]}";
do
# Compare dir name with date range
if [[ "$i" =~ $DATE_RANGE ]];
then
# I have no idea what this is, works fine without it.
[[ -d "$i" ]]
# Echo found dirs
echo "$i"
fi
done