क्या शेल चर नाम में एक हाइफ़न या डैश (-) शामिल हो सकता है?


38

मैं -शेल में चर में उपयोग करने में सक्षम नहीं हूं । क्या इसका उपयोग करने में सक्षम होने का एक तरीका है, क्योंकि मेरे पास एक स्क्रिप्ट है जो इस तरह के नामित चर पर निर्भर करती है:

$export a-b=c
-bash: export: `a-b=c': not a valid identifier

$export a_b=c

पहला दिए गए त्रुटि को फेंकता है और दूसरा ठीक काम करता है।


की संभावित क्रॉस साइट डुप्लिकेट: stackoverflow.com/questions/2821043/…
Ciro Santilli 新疆::: 中心

गोले आमतौर पर ऐसे चर नामों की अनुमति नहीं देते हैं। आपको शेल को बायपास करना होगा, शायद एक कस्टम सी प्रोग्राम के साथ जो आपके कॉमैंड के वातावरण में चर लोड कर रहा हो। क्या आप इस मिसफिट को ठीक नहीं कर सकते हैं (यहां तक ​​कि संभव गोपनीयता जोखिम)?
वॉनब्रांड

जवाबों:


47

मैं एक बॉर्न-शैली के शेल से कभी नहीं मिला हूं जिसे -एक चर नाम में अनुमति दी गई है। केवल ASCII अक्षर (किसी भी स्थिति के), _और अंक समर्थित हैं, और पहला वर्ण अंक नहीं होना चाहिए।

यदि आपके पास एक प्रोग्राम है जिसके लिए एक पर्यावरण चर की आवश्यकता होती है जो शेल प्रतिबंधों से मेल नहीं खाता है, तो इसे envप्रोग्राम के साथ लॉन्च करें ।

env 'strange-name=some value' myprogram

ध्यान दें कि कुछ गोले (उदाहरण के लिए आधुनिक डैश , mksh, zsh) उन चरों को हटा देते हैं जिनका नाम उन्हें पर्यावरण से पसंद नहीं है। ( शेलशॉक ने लोगों को पर्यावरण चर नामों के बारे में अधिक सतर्क रहने का कारण बना दिया है, इसलिए प्रतिबंध समय के साथ सख्त हो सकते हैं, अधिक अनुमेय नहीं।) इसलिए यदि आपको एक चर को पारित करने की आवश्यकता है जिसके नाम में एक कार्यक्रम में विशेष चरित्र है, तो इसे सीधे पास करें, बीच में एक शेल के बिना ( env 'strange-name=some value' sh -c'…; myprogram'काम हो सकता है या नहीं भी)।


अब काम नहीं करता है।
जेसी ग्लिक

4
@JesseGlick हाँ यह करता है। (आपकी टिप्पणी उपयोगी होगी यदि आप "काम नहीं कर रहे हैं" को परिभाषित करते हैं: किस डेटा के साथ? वांछित प्रभाव के बजाय प्रभाव क्या है? और अगर आपने कहा कि आप ने किस कार्यान्वयन envको किस ऑपरेटिंग सिस्टम पर उपयोग किया है।)
गाइल्स का SO- स्टॉप होना। बुराई '

माफ़ कीजिये। सभी अद्यतन, साथ उबंटू Yakkety envसे coreutils, shसे dash: env 'with-dashes=value' bash -c 'env | fgrep dashes'काम करता है लेकिन env 'with-dashes=value' sh -c 'env | fgrep dashes'प्रिंट कुछ भी नहीं। यही है, envस्वयं ठीक है, लेकिन डैश विशेष रूप से इन चरों को अवरुद्ध करता है। इस प्रकार यदि विचाराधीन कार्यक्रम को शेल्ड रैपर के माध्यम से एक विशिष्ट #!/bin/shहेडर के साथ लॉन्च किया जाता है , तो इस तरह के चर में पास होने का कोई स्पष्ट तरीका नहीं है। उदाहरण वर्कअराउंड
जेसी ग्लिक

@JesseGlick यह वैरिएबल हटाने वाला डैश है। आपको envप्रोग्राम के कॉलिंग साइट के करीब उपयोग करना होगा जो इस चर नाम की आवश्यकता है, बीच में बिना शेल के। डैश वैरिएबल को हटाने में अकेला नहीं है जिसका नाम उसे पसंद नहीं है।
गिल्स एसओ- बुराई को रोकें '

1
@ जेसेग्लिक यह सच है कि कुछ चीजें जो काम करती थीं, वे अब काम नहीं कर सकतीं, हालांकि शेलशॉक के बाद से , लोग चर नामों के बारे में अधिक रूढ़िवादी हो गए हैं, और डैश ने वास्तव में बदलाव किया क्योंकि मैंने यह जवाब लिखा था (शेलशॉक के परिणामस्वरूप नहीं, हालांकि, लेकिन एक ही लाइनों के साथ एक बग से बचने के लिए)। मैंने अपने उत्तर में एक नोट जोड़ा है।
गिल्स एसओ- बुराई को रोकें '

15

यह बाश में संभव नहीं है।

से परिभाषाएं की मैनुअल पृष्ठ में अनुभाग bash:

नाम एक शब्द जिसमें केवल अल्फ़ान्यूमेरिक वर्ण और अंडरस्कोर शामिल हैं, और एक वर्णमाला वर्ण या अंडरस्कोर के साथ शुरू होता है। एक पहचानकर्ता के रूप में भी जाना जाता है।

से पैरामीटर के मैनुअल पृष्ठ में अनुभाग bash:

एक पैरामीटर एक इकाई है जो मूल्यों को संग्रहीत करता है। यह एक नाम, एक संख्या, या विशेष पैरामीटर के तहत नीचे सूचीबद्ध विशेष वर्णों में से एक हो सकता है। एक चर एक नाम से निरूपित एक पैरामीटर है।


2
+1 पुरुष पृष्ठों की उपयोगिता को एक बार फिर प्रदर्शित करने के लिए
ktf

2
पुरानी पोस्ट जो मुझे पता है लेकिन, मैं यह बताना चाहता हूं कि नए लोगों के लिए मैन पेज काफी गूढ़ हो सकते हैं। मेरे पास अभी भी समय है जब मुझे बेहतर स्पष्टीकरण / उदाहरणों का शिकार करने की आवश्यकता है। कोई भी झूठ बोल रहा होगा अगर उन्होंने कहा कि यह उनके साथ कभी नहीं हुआ।
टीसीजेड 8

1
@ TCZ8 केवल लोगों ने जो मुझे बताया है कि उन्होंने सोचा था कि मैन पेज 'क्रिप्टिक' हैं, एक ही तरह के लोग हैं, जो त्रुटि संदेश नहीं पढ़ते हैं और बस सबकुछ पढ़ना छोड़ देते हैं, जो उन्हें पढ़ने की आवश्यकता है, उस पर अधिकार छोड़ देते हैं।
मील्स राउत

13

आप एक अप्रत्यक्ष संदर्भ का उपयोग करके एक हाइफ़न किए गए चर का उपयोग कर सकते हैं।

$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello

1
मैंने इस टिप्पणी को पढ़ने तक इस कार्यक्षमता के बारे में कभी नहीं सुना था। स्वीकृत उत्तर की तुलना में मेरे लिए बहुत आसान समाधान प्रदान किया।
DrStrangepork 15

7
इस व्यवहार को बैश के नए संस्करणों में अक्षम कर दिया गया है। स्थिति के गहन विश्लेषण के लिए stackoverflow.com/questions/36989263/… देखें ।
निकोलस डुडबाउट

6

यदि आपकी स्क्रिप्ट वैरिएबल नामों के हाइफ़न होने पर निर्भर करती है , तो यह एक प्रोग्रामिंग त्रुटि है। यदि यह आपके लिए सुविधाजनक है, क्योंकि जिन उपकरणों का आप नियमित रूप से उपयोग करते हैं, उनमें परिवर्तनशील नाम शामिल हैं, तो आपको अधिक और विभिन्न उपकरण सीखने पड़ सकते हैं।

क्या आपने tr का उपयोग करके हाइफ़न को अंडरस्कोर में बदलने की कोशिश की है ?

hyphenated_name="a-b"
unhyphenated_name=$(echo $hyphenated_name | tr '-' '_')
declare -x $unhyphenated_name="some value"

बैश फ़ंक्शन नामों में प्रकट होने की अनुमति '-' देता है। मेरे द्वारा हमेशा ऐसा ही किया जाता है। उदाहरण के लिए:

function foo-bar() {
   echo "$@"
}

2

डैश ( -) वर्ण एक ब्रेक चरित्र है और इसे चर नामों के भाग के रूप में अनुमति नहीं है। इसे उद्धृत चर के साथ हैक करने के तरीके हैं, लेकिन इसे पार्स करना वास्तव में समस्याग्रस्त है। बैश, विशेष रूप से ब्रेसिज़, कोष्ठक, ऑपरेटर वर्ण और उद्धरण में चर नामों के संदर्भ में विशेष अर्थ वाले अन्य वर्ण भी हैं। (उदाहरण {}()=+-&'"और अधिक)

मेरा सुझाव है कि व्यावहारिक रूप से आपको एक और प्रतिमान खोजने की जरूरत है जिस पर आप अपनी स्क्रिप्ट का निर्माण कर सकें। आपके पास "चर चर नामों" के बारे में अन्य भाषाओं के विचार हैंग हो सकते हैं। यह आमतौर पर शेल स्क्रिप्ट में एक अच्छा विचार नहीं है।

यदि आप इसे संपादित करते हैं या अपने संदर्भ के विवरण के साथ एक नया प्रश्न पूछते हैं और जो आप पूरा करने की कोशिश कर रहे हैं, तो हम इसे स्क्रिप्ट करने के लिए एक अच्छा तरीका सुझा सकते हैं।


2

बैश मैनुअल एक "नाम" को परिभाषित करता है:

एक 'शब्द' जिसमें केवल अक्षर, संख्या और अंडरस्कोर होते हैं, और एक अक्षर या अंडरस्कोर के साथ शुरू होता है। 'नाम का उपयोग शेल चर और फ़ंक्शन नामों के रूप में किया जाता है। इसके अलावा एक 'पहचानकर्ता' के रूप में जाना जाता है।

तो आप एक नाम में एक हाइफ़न का उपयोग नहीं कर सकते।


0

अधिकांश गोले केवल az, AZ, 0-9 और _ varablenames के लिए समर्थन करते हैं। इस पृष्ठ में दूसरा आइटम पढ़ें ।


0

आप env और sed से खेल सकते हैं।

एक उदाहरण के रूप में, मुझे इस चर 'ELASTICSEARCH_CLUSTER-NODES' को पढ़ने की आवश्यकता है।
एनवी कमांड आउटपुट यह:

~ $ env
ELASTICSEARCH_CLUSTER-NODES=elasticsearch:9200
JAVA_ALPINE_VERSION=8.212.04-r0
HOSTNAME=17eb9e7fec4c
...

तो चर निकालने के लिए:

ESHOST=`env | sed -n 's/ELASTICSEARCH_CLUSTER-NODES=\(.*\)/\1/p'`

-1

मेरा मानना ​​है कि केवल अक्षर, संख्या और अंडरस्कोर को बैश चर के लिए अनुमति दी जाती है। कई प्रोग्रामिंग भाषाओं में यह मामला है (जावास्क्रिप्ट एक अपवाद है)।

मैं अनुशंसा करता हूं कि आपकी स्क्रिप्ट उन प्रकार के चर नामों पर निर्भर न हो।

वास्तव में, आपको इस तरह से प्रोग्राम करने का प्रयास करना चाहिए कि आप चर नामों को अन्य नामों से बदल सकें और इससे कोई फर्क नहीं पड़ता। सामान्य तौर पर, चर नामों का वर्णन करना चाहिए कि चर में क्या है। इससे डिबग करना बहुत आसान हो जाता है; यदि आपके लिए नहीं है, तो अगले डेवलपर के लिए जो कोड का पता लगाने की कोशिश कर रहा है।


-1

आप envहिपहेंस "-" के साथ वातावरण चर सेट और अनसेट करने के लिए कमांड का उपयोग कर सकते हैं ।

सेट करने के लिए आपको अपनी कमांड चलाने के लिए env का उपयोग करना चाहिए env command:। आप इस तरह चर पास करते हैं:

env a-b=c command

इसे साथ काम करते देखें:

env a-b=c env

या इसे स्पष्ट करने के लिए:

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