क्या सीएलआई में सीधे शेल पैरामीटर चर ($ 1,…, $ @) का उपयोग करना संभव है?


9

कभी-कभी छोटे उदाहरणों में उपरोक्त चर का अनुकरण और सत्यापन करना आवश्यक होता है और फिर इसे तुरंत किसी स्क्रिप्ट, आदि में कॉपी किया जा सकता है।

मैंने निम्नलिखित तरीकों से एक सरल उदाहरण का उपयोग करके हल करने की कोशिश की:

(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh

और अन्य संयोजनों के साथ। शेबंग दुभाषिया निर्देश को जोड़कर भी प्रयोग किया गया #!/bin/sh -x, लेकिन वांछित परिणाम नहीं मिला।

क्या मैं यह बस कर सकता हूं?


1
(find $1) /tmpएक वाक्यविन्यास त्रुटि है। वास्तव (any-command) more-argumentsमें एक सिंटैक्स त्रुटि है। क्या आप अलग तरीके से समझा सकते हैं कि आप क्या करने की कोशिश कर रहे हैं?
सेलडा

2
@Celada, इसके बारे में गोले में एक सिंटैक्स त्रुटि नहीं है rcपरिवार ( rc, es, akanga...), उस मामले कि के बराबर है में जहां find $1 /tmp
स्टीफन चेजालस

जवाबों:


15

के बाद पहला तर्क sh -c inline-scriptको जाता है $0(जो भी त्रुटि संदेश के लिए प्रयोग किया जाता है), और बाकी हिस्सों में जाना $1, $2...

$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg

इसलिए आप यह चाहते हैं:

sh -c 'find "$1"' sh /tmp

(पुराने दिनों में, आप shकार्यान्वयन पा सकते हैं, जहाँ पहले arg $1इसके बजाय गया था , इसलिए आप ऐसा करेंगे:

sh -c 'find "$1"' /tmp /tmp

या:

sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2

दोनों व्यवहारों के लिए खाता है, लेकिन वे गोले अब चले गए हैं कि POSIX प्रचलित और सार्वजनिक रूप से उपलब्ध है)।


यदि आप वर्तमान शेल के भीतर स्थानीय स्कोप में सेट करना चाहते हैं $1, $2तो वहीं आप फ़ंक्शंस का उपयोग करेंगे। बॉर्न-जैसे गोले में:

my_func() {
  find "$1"
}
my_func /tmp

कुछ गोले अनाम कार्यों का समर्थन करते हैं। यह मामला है zsh:

(){find "$1"} /tmp

या es:

@{find $1} /tmp

वर्तमान स्थितीय मापदंडों को बदलने के लिए, स्थायी रूप से, वाक्यविन्यास शेल निर्भर है। dchirikov पहले से ही कवर किया है बॉर्न की तरह गोले (बॉर्न, कॉर्न, bash, zsh, POSIX, ash, yash...)।

वाक्य रचना है:

set arg1 arg2 ... argn

हालाँकि, आपको इसकी आवश्यकता है:

set --

उस सूची को खाली करने के लिए (या shift "$#") और

set -- -foo

के $1साथ शुरू करने के लिए कुछ सेट करने के लिए -या +, तो यह हमेशा के लिए उपयोग करने के लिए एक अच्छी आदत है set --विशेष रूप से जब मनमाना डेटा का उपयोग set -- "$@" other-argकरने के लिए जैसे कि स्थिति संबंधी पैरामीटर सूची के अंत में तर्क जोड़ने के लिए।

cshपरिवार के गोले ( csh, tcsh) में, आप argvसरणी पर असाइन करें :

set argv=(arg1 arg2)

के गोले में rcपरिवार ( rc, es, akanga), करने के लिए *सरणी:

*=(arg1 arg2)

यद्यपि आप व्यक्तिगत रूप से भी तत्व निर्दिष्ट कर सकते हैं:

2=arg2

fishस्थिति में , मानदंड केवलargv सरणी में हैं (नहीं $1, $@वहाँ):

set argv arg1 arg2

में zsh, साथ संगतता के लिए csh, आप भी करने के लिए प्रदान कर सकते हैं argvसरणी:

argv=(arg1 arg2)
argv[4]=arg4

और आप यह भी कर सकते हैं:

5=arg5

इसका मतलब है कि आप भी ऐसा कर सकते हैं:

argv+=(another-arg)

अंत में एक तर्क जोड़ने के लिए, और:

argv[-1]=()
argv[2]=()

अंत या बीच से एक तर्क को हटाने के लिए, जिसे आप आसानी से अन्य गोले के साथ नहीं कर सकते।


7
set --

आपको क्या चाहिए:

$ set -- aaa bbb ccc
$ echo "$1"
aaa
$ echo "$2"
bbb
$ echo "$3"
ccc
$ echo "$@"
aaa bbb ccc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.