मैं bash स्क्रिप्ट में $ 1 और $ 2 जैसे कुछ इनपुट चर को छोड़ते हुए $ * का उपयोग कैसे करूं?


15

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

elif [[ $append = $1 ]]
then
  touch ~/directory/"$2".txt
  echo "$variable_in_question" >> ~/directory/"$2".txt

या तो निम्नलिखित सभी इनपुट युक्त एक टेक्स्ट फ़ाइल बनाएं "$2", या निम्नलिखित सभी इनपुट के साथ एक मौजूदा टेक्स्ट फ़ाइल को जोड़ दें "$2", मैं "$variable_in_question"पंक्ति 4 के स्थान पर क्या उपयोग करूंगा ?

मैं मूल रूप से चाहते हैं "$*", लेकिन omitting "$1"और "$2"

जवाबों:


32

आप एक सीमा को निर्दिष्ट करने के लिए bashपैरामीटर विस्तार का उपयोग कर सकते हैं , यह स्थितिगत मापदंडों के साथ भी काम करता है। के लिए $3... $nयह होगा:

"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"

ज्ञात हो कि दोनों $@और $*पहले तर्क की उपेक्षा करते हैं $0। यदि आप आश्चर्य करते हैं कि आपके मामले में किसका उपयोग करना है: यह बहुत संभावना है कि आप एक उद्धृत करना चाहते हैं $@$*जब तक आप स्पष्ट रूप से तर्क को व्यक्तिगत रूप से उद्धृत नहीं करना चाहते तब तक उपयोग न करें ।

आप इसे निम्नानुसार आज़मा सकते हैं:

$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6

ध्यान दें कि पहले उदाहरण $0में पहले तर्क से भरा 0जाता है जबकि किसी स्क्रिप्ट में उपयोग किए जाने के $0बजाय स्क्रिप्ट के नाम से भरा जाता है, जैसा कि दूसरा उदाहरण दिखाता है। करने के लिए स्क्रिप्ट का नाम bashनिश्चित रूप से है , पहला तर्क सिर्फ इतना है कि यह आम तौर पर इस तरह के रूप में माना जाता नहीं कर रहा है - एक ही चला जाता है के लिए एक स्क्रिप्ट निष्पादन योग्य बना दिया है और "सीधे" कहा जाता है। तो पहले उदाहरण में हमारे पास $0= 0, $1= है1 आदि है जबकि दूसरे में यह $0= script_file, $1= 0, $2= 1आदि; ${@:3}से शुरू होने वाले प्रत्येक तर्क का चयन करता है $3

संभव श्रेणियों के लिए कुछ अतिरिक्त उदाहरण:

 # two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
 # every argument starting with the second to last one
 # a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
 # two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3

आगे की पढाई:


27

आप shiftबिलिन का उपयोग कर सकते हैं :

$ help shift
shift: shift [n]
    Shift positional parameters.

    Rename the positional parameters $N+1,$N+2 ... to $1,$2 ...  If N is
    not given, it is assumed to be 1.

    Exit Status:
    Returns success unless N is negative or greater than $#.

पूर्व। दिया हुआ

$ cat argtest.bash 
#!/bin/bash

shift 2

echo "$*"

फिर

$ ./argtest.bash foo bar baz bam boo
baz bam boo

3
@ ऑरोप्लाज्म मुझे लगता है कि यह ध्यान देने योग्य है कि shiftदृष्टिकोण को एक्सेस करना असंभव हो जाएगा $1और $2आपके द्वारा उन्हें स्थानांतरित करने के बाद। आपकी स्क्रिप्ट में आप के $2साथ उपयोग करते हैं $variable_in_question, आपको या तो उसे बदलने या पैरामीटर विस्तार दृष्टिकोण का उपयोग करने की आवश्यकता होती है।
मिठाई

6
shiftअच्छा जब पहली एक या अधिक आर्ग विशेष कर रहे हैं और यह समझ में आता है (अलग-अलग वैरिएबल में उन्हें बाहर लेने के लिए है foo="$1"; bar="$2";, या if [[ something with $1 ]];then blah blah; shift। लेकिन @ गैर विनाशकारी दृष्टिकोण के साथ मिठाई के जवाब अन्य मामलों में अच्छा है जब आप करते हैं अभी भी पूरी सूची बाद में चाहते हैं , या जब आप फैन्सी सिंटैक्स का उपयोग करते हैं तो सीमित सीमा तक आर्गन्स को निकालने के लिए, अनन्तता के लिए नहीं, बिना किसी खाली कमांड को पेश किए बिना अगर $@उसमें बहुत सारे तत्व नहीं हैं।
पीटर कोर्ड्स

13

आम तौर पर, आप स्थिति के मापदंडों को एक सरणी में कॉपी कर सकते हैं, सरणी के मनमाने ढंग से सूचकांकों को हटा सकते हैं और फिर अपने मूल तर्कों को खोए बिना उन सूचकांकों का विस्तार करने के लिए सरणी का उपयोग कर सकते हैं।

उदाहरण के लिए, यदि मैं पहले, चौथे और पांचवें को छोड़कर सभी आर्गन्स चाहता था:

args=( "$@" )
unset args[0] args[3] args[4]
echo "${args[@]}"

प्रतिलिपि में, सूचकांकों को 1 से स्थानांतरित किया जाता है, क्योंकि $0इसका हिस्सा नहीं है $@


1
बेशक यह संभव है कि echo "${args[@]:2}"तीसरे से अंतिम तर्क के लिए , उदाहरण के लिए , गठबंधन करें ।
मिठाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.