2012-09-08 4 views
10

मैंने एक बैश स्क्रिप्ट बनाई है जिसे मैं हर घंटे crontab के साथ चलाता हूं, और मुझे एक चर को स्टोर करने की आवश्यकता है ताकि अगली बार जब मैं इसे चला सकूं। लिपि प्रत्येक बार चलने पर चर बदलती है, इसलिए मैं इसे हार्डकोड नहीं कर सकता। अभी मैं इसे एक txt फ़ाइल में लिख रहा हूं और फिर इसे वापस पढ़ रहा हूं। क्या इससे ऐसा करने का कोई बेहतर तरीका है? और जिस तरह से मैं txt फ़ाइल पढ़ रहा हूं वह कुछ है जो मैंने यहां पाया है, मुझे समझ में नहीं आ रहा है, और यह थोड़े घबराहट है। क्या इसके लिए कोई अंतर्निहित कमांड नहीं है? वैसे भी, यहां लागू कोड है, कुछ चर बदलना आसान बनाने के लिए बदल गया है।bash- रनों के बीच चर स्टोर करने के लिए बेहतर तरीका?

while read x; do 
    var=$x 
done < var.txt 

# Do some stuff, change var to a new value 

echo $var > var.txt 

चर केवल एक पूर्णांक है, इसलिए टेक्स्ट फ़ाइल ओवरकिल महसूस करती है।

+1

निरंतर डेटा रखने वाली छोटी पाठ फ़ाइल बिल्कुल ऐसा करने का तरीका है, इसके बारे में कुछ भी नहीं है। – user4815162342

उत्तर

6

var का उपयोग करने की कोई आवश्यकता नहीं है; x वर्तमान खोल के दायरे में होगा। वैकल्पिक रूप से,

read var < var.txt 
# do stuff with var 
echo $var > var.txt 

मैं चर स्टोर करने के लिए एक साधारण पाठ फ़ाइल का उपयोग करें। हालांकि, स्वयं-संशोधित स्क्रिप्ट का (अत्यधिक संदिग्ध) विकल्प है। केवल मनोरंजन प्रयोजनों के लिए !

#!/bin/bash 

read val < <(tail -n 1 "$0") 

((val++)) 
echo "$val" 

tmp=$(mktemp /tmp/XXXXXXX) 
sed '$s/.*/'$val'/' "$0" > "$tmp" 
mv "$tmp" "$0" 

exit 
0 

कुंजी कुछ भी नहीं के बाद यह निष्पादित करेंगे अगले करने वाली अंतिम पंक्ति से बाहर निकलने के आदेश बनाने की है, इसलिए। आखिरी पंक्ति वैरिएबल वैल्यू है जिसे आप जारी रखना चाहते हैं। जब स्क्रिप्ट चलती है, तो यह read एस अपनी आखिरी पंक्ति से है। इससे पहले कि यह निकलता है, यह sed का उपयोग करता है ताकि खुद को टोए temp फ़ाइल की प्रतिलिपि लिख सकें, अंतिम पंक्ति के वर्तमान मूल्य के साथ संशोधित अंतिम पंक्ति के साथ। फिर हम वर्तमान स्क्रिप्ट को temp फ़ाइल के साथ ओवरराइट करते हैं (मानते हैं कि हमें ऐसा करने की अनुमति होगी)।

लेकिन गंभीरता से? ऐसा मत करो।

+0

धन्यवाद, यह बहुत आसान है। क्या टेक्स्ट फाइलें ऐसा करने का सबसे अच्छा तरीका हैं? – shardbearer

+0

@ शर्डबेयर: यह निर्भर करता है। आप फ़ाइल, डेटाबेस, अन्य विदेशी जावा/रूबी/पायथन ऑब्जेक्ट-पर्सिस्टेंस स्टोर्स से चुन सकते हैं, या अपने प्रोग्राम को एक अनंत लूप (एम्बेडेड उचित नींद के समय के साथ) में चलाना जारी रख सकते हैं और अपनी समग्र आवश्यकताओं के आधार पर मूल्य को स्मृति में संग्रहीत कर सकते हैं कर रहे हैं। फ़ाइल दृढ़ता आमतौर पर पर्याप्त है। यदि आप हजारों फाइलों और डीआईआरएस के साथ एक मोंगो सिस्टम में शामिल हो रहे हैं (जैसा कि हाल ही में एसओ पर प्रस्तुत किया गया है), तो आपको सही तकनीक खोजने में कुछ समय बिताना होगा। आप सभी को शुभकामनायें। – shellter

+0

डाउनवॉटर: कृपया अपने कारण पर टिप्पणी करें। क्या यह घृणास्पद स्वयं-संशोधित कोड की वजह से है? :) – chepner

1

1- आप अपनी स्क्रिप्ट को आसान बनाने में कर सकते हैं के रूप में आप केवल एक चर

var=`cat var.txt` 
# Do some stuff, change var to a new value 
echo $var > var.txt 

2- आप वातावरण में अपने चर स्टोर कर सकते हैं:

export var 

# Do some stuff, change var to a new value 

लेकिन संकेत देने के लिए की आवश्यकता होगी यह . script.ksh (भिखारी पर डॉट)। लेकिन इसमें इसमें 'बाहर निकलना' नहीं होना चाहिए और मुझे यकीन नहीं है कि यह क्रॉन में काम करेगा ...

-1

मैं निम्नलिखित कर रहा हूं। एक फ़ाइल में चर पसंद करेंगे, लेकिन यह कोड थोड़ा सा blats। यह चीज़ कैसे काम करती है? आप अलग-अलग फ़ाइल में एकाधिक चर स्टोर कर सकते हैं, variables.txt कहें, और उसके बाद अपना मुख्य प्रोग्राम main.sh. कहें। यद्यपि चर लोड करने और सहेजने के लिए पृथक स्क्रिप्ट लिखना बेहतर हो सकता है।

varibles.txt के लिए:

A=0 
B=0 
C=0 

main.sh के लिए:

#!/bin/bash 

#reload variables 
A=`cat ./variables.txt|grep "A="|cut -d"=" -f2` 
B=`cat ./variables.txt|grep "B="|cut -d"=" -f2` 
C=`cat ./variables.txt|grep "C="|cut -d"=" -f2` 

#print variables 
printf "$A\n" 
printf "$B\n" 
printf "$C\n" 

#update variables 
A=$((($A+1))) 
B=$((($B+2))) 
C=$((($C+3))) 

#save variables to file 
#for A 
#remove entry for A 
cat ./variables.txt|grep -v "A=">>./tmp.txt 
#save entry for A 
printf "A=$A\n">>./tmp.txt 
#move tmp.txt to variables.txt 
mv ./tmp.txt ./variables.txt 

#for B 
#remove entry for B 
cat ./variables.txt|grep -v "B=">>./tmp.txt 
#save entry for B 
printf "B=$B\n">>./tmp.txt 
#move tmp.txt to variables.txt 
mv ./tmp.txt ./variables.txt 

#for C 
#remove entry for C 
cat ./variables.txt|grep -v "C=">>./tmp.txt 
#save entry for C 
printf "C=$C\n">>./tmp.txt 
#move tmp.txt to variables.txt 
mv ./tmp.txt ./variables.txt 
+2

कोई अपराध नहीं, लेकिन यह भयानक है। आप स्वयं को पार्स करने के बजाय फ़ाइल 'variables.txt'' को बेहतर 'स्रोत' करेंगे। इसके अलावा, बिल्ली के बेकार उपयोगों को देखा! –

2

मैं जानता हूँ कि यह एक पुराने सवाल है। लेकिन, मैं अभी भी उम्मीद में अपने समाधान को पोस्ट करने का फैसला करता हूं कि यह उन लोगों के लिए सहायक हो सकता है जो यहां सत्रों के बीच env vars को क्रमबद्ध करने के तरीके की खोज में आते हैं।

सरल तरीका सिर्फ एक फ़ाइल में "var_name = var_value" लिखता है, "./en वातावरण" कहें। और फिर निम्नलिखित सत्रों में "स्रोत ./envrion"।उदाहरण के लिए:

declare -p var1 var2 > ./environ 
# NOTE: no '$' before var1, var2 

बाद में, स्रोत के बाद ":

echo "var1=$var1" > ./environ 

एक अधिक व्यापक (? और सुरुचिपूर्ण) जिस तरह चर के सभी विशेषताओं जारी रहती है" -p घोषित "का उपयोग करने के लिए है।/envrion "आप var1 var2 प्राप्त कर सकते हैं इसके मूल्य के अलावा पुनर्स्थापित सभी विशेषताओं के साथ। इसका मतलब यह है कि यह सरणी, पूर्णांक इत्यादि को संभाल सकता है

"declare -p xx" के लिए एक चेतावनी, हालांकि: यदि आप किसी स्रोत में "स्रोत ./environ" को लपेटते हैं, तो सभी सोर्स किए गए चर फ़ंक्शन के भीतर दिखाई दे रहे हैं केवल इसलिए कि डिफ़ॉल्ट रूप से "घोषित" स्थानीय लोगों के रूप में चर घोषित करता है। इसे रोकने के लिए, आप या तो किसी भी फ़ंक्शन (या अपने "मुख्य" फ़ंक्शन में) से "स्रोत" या "/g" को संशोधित करने के बाद "-g" जोड़ने के लिए संशोधित कर सकते हैं (जो संबंधित चर वैश्विक बनाता है)। उदाहरण के लिए:

sed -i 's/^declare\(-g\)*/declare -g/' ./environ 
# "\(-g\)?" ensure no duplication of "-g" 
+0

यह एक साधारण दृष्टिकोण है, और मैं इसे स्वयं उपयोग करता हूं। यह मांग की देखभाल करता है, अगर अविश्वसनीय उपयोगकर्ता फ़ाइल में लिखने में सक्षम हैं (उदाहरण के लिए यदि यह '/ tmp' में है और प्रारंभ में नहीं बनाया गया है), क्योंकि इसमें सोर्सिंग शैल की पूर्ण क्षमताएं हैं। ध्यान रखें! –

+0

@TobySpeight आप सही हैं, और धन्यवाद। –

संबंधित मुद्दे