साधारण लूप काम नहीं कर रहा है


-1

एक साधारण स्क्रिप्ट

now="$(date +'%d_%m_%Y')"
path="/var/www/vitalii/backups"
sites=("site1.ru site2.ru site3.ru")

for i in ${sites[*]}
do
    echo "$path/$i"
    #tar -cvzf $path/$i_${now}.tgz /var/www/vitalii/$i
done

echo के रूप में काम करता है, 3 लाइनों प्रिंट लेकिन टिप्पणी की tar लाइन के अनुसार काम नहीं करता है, केवल 1 संग्रह बनाता है, क्या गलत है? कृपया मुझे बताओ।



1
साइरस का जवाब आपको आवश्यक समाधान लगता है। लेकिन, अगली बार जब भी आपके पास इस तरह की कोई स्थिति हो, तो हमारे द्वारा बनाए गए एक संग्रह का नाम बताएं (जैसे, (तारीख) .tgz )। इससे यह पता लगाना बहुत आसान हो जाएगा।
G-Man

ओह, भी, आप का उपयोग करने पर विचार करना चाह सकते हैं %Y_%m_%d फ़ाइल नाम के लिए-समान प्रारूप, इसलिए लेक्सिकोग्राफ़िक (अल्फ़ान्यूमेरिक) सॉर्ट क्रम आपको कालानुक्रमिक सॉर्टिंग देता है।
G-Man

जवाबों:


2

समस्या के अलावा @Cyrus ने बताया, आप साइटों को गलत उपयोग कर रहे हैं। आप वास्तव में दो गलतियाँ कर रहे हैं जो (विडंबना) अधिकतर एक दूसरे को रद्द करती हैं। सबसे पहले, जब आप सरणी को परिभाषित करते हैं sites=("site1.ru site2.ru site3.ru")उद्धरण प्रत्येक साइट को एक अलग तत्व बनाने के बजाय एक एकल सरणी तत्व बनाते हैं। फिर, जब आप इसे देखें ${sites[*]}, को [*] यह सभी तत्वों को एक साथ मिक्स करता है (रिक्त स्थान से अलग) (या यदि एक से अधिक तत्व होते हैं), और फिर इसके आसपास डबल-कोट्स की कमी का मतलब है कि यह रिक्त स्थान पर परिणाम देता है (बजाय सरणी तत्वों के बीच) ), और किसी भी वाइल्डकार्ड आदि का विस्तार करता है।

नेट परिणाम: आपको किसी सरणी का उपयोग करने का कोई लाभ नहीं मिल रहा है, और यदि किसी भी नाम के साथ आपके पास शेल मेटाचैकर्स हैं तो आपके पास ... अनपेक्षित ... व्यवहार होगा। इस मामले में यह परेशानी का कारण होने की संभावना नहीं है (समस्याग्रस्त अक्षर आमतौर पर डीएनएस में वैसे भी मना किए जाते हैं), लेकिन इस अधिकार को करना सीखना बेहतर है:

now="$(date +'%d_%m_%Y')"
path="/var/www/vitalii/backups"
sites=(site1.ru site2.ru site3.ru)  # If any elements had spaces or other funny characters, you'd need to quote them INDIVIDUALLY

for i in "${sites[@]}"  # Double-quotes and [@] make it treat each element as a "word", even if they contain funny characters
do
    echo "$path/$i"
    tar -cvzf "$path/${i}_${now}.tgz" "/var/www/vitalii/$i"  # ${i}_ keeps it from treating "_" as part of the variable name
done

EDIT: जैसा कि @ G-Man ने एक अन्य टिप्पणी में बताया, जिसमें डबल-कोट्स का उपयोग किया गया है सब चर संदर्भ एक अच्छा विचार है। मैंने यह ऊपर तय किया है ...


1

बदलने के

$path/$i_${now}.tgz

द्वारा

$path/${i}_${now}.tgz

अब यह 3 अभिलेखागार बनाता है, लेकिन फ़ाइल नाम {site1.ru} _28_02_2015.tgz {site2.ru} _28_02_2015.tgz हैं ...
user3446561

2
उपयोग ${i} नहीं {$i}
Cyrus

2
इसके अलावा, जबकि यह वास्तव में इस मामले में बात नहीं कर सकता है, एक सामान्य नियम के रूप में, चर वाले सभी शब्दों को उद्धृत किया जाना चाहिए; उदाहरण के लिए, tar -cvzf "$path/${i}_${now}.tgz" "/var/www/vitalii/$i"। इस मामले में भी, ${now} ब्रेसिज़ की जरूरत नहीं है और हो सकता है $now
G-Man
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.