शेल स्क्रिप्टिंग में इस $ {@: 2} का क्या अर्थ है


27

मैं इसे एक शेल स्क्रिप्ट में देखता हूं।

variable=${@:2}

यह क्या कर रहा हैं?


क्या वास्तव में यह स्क्रिप्ट में दिखाया गया है? वाक्य-विन्यास एक सरणी की तरह दिखता है, लेकिन कुछ टुकड़े गायब हैं। क्या आप स्क्रिप्ट से इस लाइन के आसपास कुछ पंक्तियाँ पोस्ट कर सकते हैं?
SLM

यह एक चर है जो दूसरे अक्षर से शुरू होता है। var="my_value"; echo var="${var[@]:2}"; echo "$var"फर्क देखें?
वैलेंटाइन बजरमी

जवाबों:


34

यह $@बैश में, विशेष चर की सामग्री दिखा रहा है । इसमें सभी कमांड लाइन तर्क हैं, और यह कमांड दूसरे से सभी तर्कों को ले रहा है और उन्हें एक चर में संग्रहीत कर रहा है variable

उदाहरण

यहां एक परीक्षा की पटकथा है।

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

उदाहरण रन:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

संदर्भ


9
ध्यान दें कि तकनीक ने दिए गए तर्कों को एक ही स्ट्रिंग में मैश कर दिया। यदि आपको उन्हें अलग-अलग तर्कों के रूप में रखने की आवश्यकता है, तो एक सरणी का उपयोग करें:vars=( "${@:2}" )
ग्लेन जैकमैन

@glennjackman - यह इंगित करने के लिए धन्यवाद।
SLM

2
घुंघराले कोष्ठक के उपयोग पर भी ध्यान दें। आप हमेशा घुंघराले कोष्ठक का उपयोग करने वाले होते हैं, लेकिन संदर्भ के अस्पष्ट होने पर बैश आपको उन्हें छोड़ देता है। इसलिए, $@और ${@}समान हैं, हालांकि उत्तरार्द्ध "अधिक सही" सिंटैक्स है। आपको कोष्ठक का उपयोग करना होगा ${@:2}, क्योंकि $@:2अस्पष्ट है और इसलिए इसकी व्याख्या की जाएगी ${@}:2, जो कि समान बात नहीं है।
धान लैंडौ

14

यह हाल के संस्करणों kshमें भी पाया गया है bashऔर एक विशेषता है zsh

में kshऔर bash, आप का उपयोग करके एक सरणी के कई तत्वों का उपयोग कर सकते ${array[@]:first:length}वाक्य रचना है, जो करने के लिए अप करने के लिए फैलता है length(या सभी करता है, तो lengthछोड़ दिया जाता है) के तत्वों arrayसरणी (सरणी के तत्वों की सूची में अनुक्रमित पर संख्यानुसार क्रमबद्ध), के साथ शुरू सूचकांक के साथ पहले वाला अधिक या उसके बराबर first। जब स्केलर के संदर्भ में (जैसे एक स्केलर चर के लिए एक असाइनमेंट में) तत्वों की सूची अंतरिक्ष वर्णों के साथ bashऔर (या खाली होने पर खाली या अंतरिक्ष कुछ भी नहीं है) ksh93के पहले चरित्र के साथ जुड़ जाती है ।$IFS$IFSzsh

उदाहरण के लिए:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@एक विशेष मामला है। $@स्थितीय मापदंडों का सरणी है ( $1, $2...)। लेकिन जब इसका उपयोग किया जाता है :, तो $0इसे भी शामिल किया जाता है। तो ${@:1}वही है $@, ${@:0}अन्य सरणियों के लिए पसंद नहीं है ।

में zsh, यह थोड़ा अलग है। सिंटैक्स को केवल संगतता के लिए हाल ही में zshजोड़ा गया है kshलेकिन तत्वों की श्रेणियों के चयन के लिए इसका अपना सिंटैक्स है।

के विपरीत kshऔर bash, zshसरणियों अदिश चर से एक अलग चर प्रकार के होते हैं, विरल नहीं हैं ( zshएक और चर प्रकार के रूप में साहचर्य सरणियों है) और सूचकांक 1 के बजाय 0 पर शुरू करते हैं।

के लिए zsh, आप ऐरे एलीमेंट रेंज तक पहुँचते हैं $a[first,last](जहाँ lastअंत से पीछे की ओर गिनने के लिए नकारात्मक भी हो सकते हैं)।

में zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

235 तत्वों के साथ एक सरणी बनाता है, उनमें से अधिकांश खाली हैं। $a[12,50]12 से 50 तक तत्वों का विस्तार करेगा, और ${a[@]:12:2}केवल (खाली) $a[12]और $a[13]तत्वों तक विस्तार करेगा । एक विशेष मामले के रूप में, और फिर से पोर्टेबिलिटी के लिए ksh93और bash, के रूप में zshभी उस के 0लिए एक पहला तत्व स्वीकार $@करता है $0

तो, आप उपयोग कर सकते हैं ${a[@]:x:n}और ${@:x:n}portably सभी 3 गोले भर में है, लेकिन केवल गैर विरल सरणियों, और भारतीय विदेश सेवा के मूल्य के भुगतान के लिए ध्यान।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.