गोल्डीलॉक्स 'टिप्पणी और मानवता के संदर्भ का वर्णन के रूप में,
shiftस्थितीय मानकों (reassigns $1, $2आदि) ताकि $1के पुराने मूल्य पर ले जाता $2,
$2के मूल्य पर ले जाता है $3आदि, *
के पुराने मूल्य $1खारिज कर दिया है। ( $0नहीं बदला गया है।) ऐसा करने के कुछ कारणों में शामिल हैं:
- यह आपको दसवें तर्क (यदि कोई है) को अधिक आसानी से एक्सेस करने देता है।
$10काम नहीं करता है - यह $1एक के साथ संक्षिप्त रूप में व्याख्या की जाती है 0
(और इसलिए कुछ ऐसा उत्पादन कर सकता है Hello0)। एक के बाद shift, दसवां तर्क बन जाता है $9। (हालांकि, अधिकांश आधुनिक गोले में, आप उपयोग कर सकते हैं ${10}।)
- जैसा कि शुरुआती के लिए बैश गाइड प्रदर्शित करता है, इसका उपयोग तर्कों के माध्यम से लूप करने के लिए किया जा सकता है। IMNSHO, यह अनाड़ी है;
forउसके लिए बेहतर है।
- जैसा कि आपकी उदाहरण लिपि में है, यह कुछ को छोड़कर सभी तर्कों को उसी तरह से संसाधित करना आसान बनाता है। उदाहरण के लिए, आपकी स्क्रिप्ट में,
$1और $2टेक्स्ट स्ट्रिंग्स हैं, जबकि $3अन्य सभी पैरामीटर फ़ाइल नाम हैं।
तो यहां बताया गया है कि यह कैसे खेलता है। मान लीजिए कि आपकी स्क्रिप्ट को कहा जाता है Patryk_scriptऔर इसे कहा जाता है
Patryk_script USSR Russia Treaty1 Atlas2 Pravda3
स्क्रिप्ट देखती है
$1 = USSR
$2 = Russia
$3 = Treaty1
$4 = Atlas2
$5 = Pravda3
कथन ostr="$1"चर ostrको सेट करता है USSR। पहला shiftबयान निम्नानुसार स्थितीय मापदंडों को बदलता है:
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
कथन nstr="$1"चर nstrको सेट करता है Russia। दूसरा shiftकथन स्थितिगत मापदंडों को निम्नानुसार बदलता है:
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
और फिर forलूप बदल जाता है USSR( $ostr) से Russia( $nstr) फाइल Treaty1में Atlas2, और Pravda3।
स्क्रिप्ट के साथ कुछ समस्याएं हैं।
$ @ में फ़ाइल के लिए; करना
यदि स्क्रिप्ट के रूप में लागू किया गया है
पैट्रीक_स्क्रिप्ट यूएसएसआर रूस ट्रीटी 1 "वर्ल्ड एटलस 2" प्रवीडा 3
यह देखता है
$ 1 = यूएसएसआर
$ 2 = रूस
$ 3 = संधि 1
$ 4 = विश्व एटलस 2
$ 5 = प्रावदा 3
लेकिन, क्योंकि $@उद्धृत नहीं है, में अंतरिक्ष World Atlas2उद्धृत नहीं है, और forपाश सोचता है कि यह चार फ़ाइलें हैं: Treaty1, World, Atlas2, और Pravda3। यह या तो होना चाहिए
"$ @" में फ़ाइल के लिए; करना
(तर्कों में किसी विशेष वर्ण को उद्धृत करने के लिए) या बस
फ़ाइल के लिए
(जो लंबे संस्करण के बराबर है)।
eval "sed" / "$ ostr" / "$ nstr" / g '$ फ़ाइल "
इसके लिए कोई ज़रूरत नहीं है eval, और कैन के लिए अनियंत्रित उपयोगकर्ता इनपुट को पारित evalकरना खतरनाक हो सकता है। उदाहरण के लिए, यदि स्क्रिप्ट के रूप में लागू किया गया है
पैट्रीक_स्क्रिप्ट "'; आरएम *;" "रूस ट्रीटी 1 एटलस 2 प्रावदा 3
इसे अंजाम देंगे rm *! यह एक बड़ी चिंता का विषय है अगर स्क्रिप्ट को उन विशेषाधिकारों के साथ चलाया जा सकता है जो उपयोगकर्ता को आमंत्रित करते हैं; उदाहरण के लिए, यदि इसे sudoवेब इंटरफ़ेस से चलाया या चलाया जा सकता है। यह शायद इतना महत्वपूर्ण नहीं है यदि आप इसे अपने आप के रूप में, अपनी निर्देशिका में उपयोग करते हैं। लेकिन इसे बदला जा सकता है
sed "s / $ ostr / $ nstr / g" "$ फ़ाइल"
यह अभी भी कुछ जोखिम है, लेकिन वे बहुत कम गंभीर हैं।
if [ -f $file ], > $file.tmpऔर mv $file.tmp $file
होना चाहिए if [ -f "$file" ], > "$file.tmp"और mv "$file.tmp" "$file", क्रमशः, उन फ़ाइल नामों को संभालने के लिए जो उनमें रिक्त स्थान (या अन्य मज़ेदार वर्ण) हो सकते हैं। ( eval "sed …कमांड उन नामों को भी दर्ज करता है जिनके पास रिक्त स्थान है।)
* shift एक वैकल्पिक तर्क लेता है: एक सकारात्मक पूर्णांक जो निर्दिष्ट करता है कि कितने मापदंडों को स्थानांतरित करना है। डिफ़ॉल्ट एक ( 1) है। उदाहरण के लिए, shift 4का कारण बनता है $5
बनने के लिए $1,
$6बनने के लिए $2, और इतने पर। (ध्यान दें कि शुरुआती के लिए बैश गाइड में उदाहरण गलत है।) और इसलिए आपकी स्क्रिप्ट को कहने के लिए संशोधित किया जा सकता है
ostr="$1"
nstr="$2"
shift 2
जिसे अधिक स्पष्ट माना जा सकता है।
नोट नोट / चेतावनी:
विंडोज कमांड प्रॉम्प्ट (बैच फ़ाइल) भाषा भी एक SHIFTकमांड का समर्थन करती है , जो मूल रूप से shiftयूनिक्स के गोले में कमांड के समान काम करती है , एक हड़ताली अंतर के साथ, जिसे मैं छिपाने की कोशिश करूंगा ताकि लोग इसे भ्रमित न हों।
- एक कमांड की तरह
SHIFT 4एक त्रुटि है, "SHIFT कमांड के लिए अमान्य पैरामीटर" त्रुटि संदेश।
SHIFT /n, जहां n0 और 8 के बीच पूर्णांक है, मान्य है - लेकिन यह बार-बार शिफ्ट नहीं होता है । यह एक बार बदलाव, के साथ शुरू n वें तर्क। तो कारण बनता है (पाँचवाँ तर्क) बनने के लिए , और इसी तरह, तर्कों को छोड़कर 3 अकेले।n SHIFT /4%5%4,
%6%5
pushdऔरpopd)।