将grep输出放在循环中的变量中

时间:2016-09-05 21:42:44

标签: linux bash

我有CentOS和这个bash脚本:

#!/bin/sh
files=$( ls /vps_backups/site )
counter=0
for i in $files ; do
echo $i | grep -o -P '(?<=-).*(?=.tar)'
let counter=$counter+1
done

在站点文件夹中,我使用以下名称压缩备份:

    site-081916.tar.gz
    site-082016.tar.gz
    site-082116.tar.gz
    ...

上面的代码打印: 081916 082016 082116

我想将每个提取的日期都放到变量中,所以我替换了这一行

echo $i | grep -o -P '(?<=-).*(?=.tar)'

用这个:

dt=$($i | grep -o -P '(?<=-).*(?=.tar)')
echo $dt

但是我收到了这个错误:

./test.sh: line 6: site-090316.tar.gz: command not found

请帮忙吗?

由于

2 个答案:

答案 0 :(得分:2)

您仍然需要echo内的$(...)

dt=$(echo $i | grep -o -P '(?<=-).*(?=.tar)')

答案 1 :(得分:1)

不要在脚本中使用ls。请改用shell模式。此外,您不需要使用grep; bash有一个内置的正则表达式运算符。

#!/bin/bash
files=$( /vps_backups/site/* )
counter=0
for i in "${files[@]#/vps_backups/site/}" ; do
  [[ $i =~ -(.*).tar.gz ]] && dt=${BASH_REMATCH[1]}
  counter=$((counter + 1))
done