Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays BASH-在数组中查找正则表达式,打印找到的数组项_Arrays_Regex_Bash - Fatal编程技术网

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