गोल्डीलॉक्स 'टिप्पणी और मानवता के संदर्भ का वर्णन के रूप में,
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
, जहां n
0 और 8 के बीच पूर्णांक है, मान्य है - लेकिन यह बार-बार शिफ्ट नहीं होता है । यह एक बार बदलाव, के साथ शुरू n वें तर्क। तो कारण बनता है (पाँचवाँ तर्क) बनने के लिए , और इसी तरह, तर्कों को छोड़कर 3 अकेले।n
SHIFT /4
%5
%4,
%6
%5
pushd
औरpopd
)।