मेरे पास CentOS और यह बैश स्क्रिप्ट है:

#!/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
oussama kamal 6 सितंबर 2016, 00:42

2 जवाब

सबसे बढ़िया उत्तर

आपको अभी भी echo $(...) के अंदर चाहिए:

dt=$(echo $i | grep -o -P '(?<=-).*(?=.tar)')
2
J Earls 6 सितंबर 2016, 00:44

किसी स्क्रिप्ट में ls का प्रयोग न करें। इसके बजाय एक खोल पैटर्न का प्रयोग करें। साथ ही, आपको 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
1
chepner 6 सितंबर 2016, 02:03