बाश में मल्टी लाइन उर्फ


13

मेरे पास निम्न स्क्रिप्ट है। यह एक सरल परीक्षण मामला है जहां aकोई भी स्ट्रिंग मान है और bइसे एक पथ माना जाता है।

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

हालाँकि जब भी मैं निष्पादित करने का प्रयास करता हूं ।/ample.sh मुझे निम्नलिखित त्रुटियाँ मिलती हैं:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

और जब मैं कोशिश करता source sample.shहूं तो मुझे निम्नलिखित मिलते हैं:

a: Undefined variable.

मेरा उद्देश्य इसे एक उपनाम बनाना था ताकि मैं इस स्क्रिप्ट को स्रोत बना सकूं और कमांड की लाइन को निष्पादित करने के लिए सिर्फ अन्य नाम चला सकता हूं। क्या कोई इसे देख सकता है और मुझे बता सकता है कि त्रुटि क्या है?


3
जब आपको लगता है कि आपको मल्टीलाइन और मल्टीपल-कमांड उपनाम की आवश्यकता है, तो यह एक फ़ंक्शन को परिभाषित करने या स्क्रिप्ट बनाने का समय है।
सर्गी कोलोडाज़नी

@SergiyKolodyazhnyy ने उल्लेख किया कि
मिरांडा

जवाबों:


15

आपके यहां कुछ मुद्दे हैं

  1. cshइन bash(और अन्य बॉर्न-जैसे गोले) के विपरीत , एलियाज़ को एक =संकेत जैसे उदाहरण के साथ सौंपा गया हैalias foo=bar

  2. उद्धरण इस तरह से नेस्टेड नहीं किया जा सकता है; इस स्थिति में, आप उपनाम के आसपास एकल उद्धरण और दोहरे उद्धरण चिह्नों का उपयोग कर सकते हैं

  3. बैकस्लैश \एक लाइन निरंतरता वर्ण है: वाक्य-रचना के अनुसार, यह आपकी कमांड को एक ही लाइन में बनाता है (आप जो चाहते हैं उसके विपरीत)

इसलिए

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

परीक्षण: पहले हम फ़ाइल स्रोत:

$ . ./myscript.sh

फिर

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

यदि आप किसी स्क्रिप्ट के भीतर उपनाम का उपयोग करना चाहते हैं , तो याद रखें कि एलियासेस केवल डिफ़ॉल्ट रूप से इंटरैक्टिव गोले में सक्षम हैं: उन्हें एक स्क्रिप्ट के अंदर सक्षम करने के लिए आपको जोड़ना होगा

shopt -s expand_aliases

उपरोक्त सब कुछ के बावजूद, आपको इस तरह की चीजों के लिए एक उपनाम के बजाय एक शेल फ़ंक्शन का उपयोग करने पर विचार करना चाहिए


1
उपनाम के आसपास एकल उद्धरण का उपयोग करने का एक अन्य कारण यह है कि दोहरे उद्धरण चिह्नों के अंदर चर का विस्तार किया जाता है, इसलिए $aऔर $bपरिभाषा समय पर विस्तारित किया जाएगा, जब उपनाम को निष्पादित नहीं किया जाता है।
बारमर

समाधान के लिए धन्यवाद, यहाँ समस्या मेरे द्वारा दी गई पटकथा को लिखने के बावजूद है और जब मैं इसे निष्पादित करता हूँ तो मुझे jo मिलता है: किसी कारण से उपनाम नहीं मिला, जो पंजीकृत नहीं है। जब मैं फ़ाइल को स्रोत करता हूं तब मुझे यह त्रुटि मिलती है "बेजोड़"। केवल एक ही कारण है कि मैं उपनाम और कार्य नहीं कर रहा हूं, कारण है कि मैं इस लाइन को कमांड लाइन पर कॉल करना चाहता हूं और फ़ंक्शन में मुझे पता नहीं है कि इसे कैसे प्राप्त किया जाए। मैंने देखा है। फ़ंक्शन कॉल आमतौर पर स्क्रिप्ट के भीतर होता है। उपनाम का उपयोग सिर्फ यह सुनिश्चित करने के लिए था कि मैं इसे एक फ़ंक्शन की तरह उपयोग कर सकता हूं और जब भी मैं चाहता हूं, इसे कॉल कर सकता हूं
जोविन मिरांडा

वैसे भी यह तय है, मैं डिफ़ॉल्ट खोल tcsh के रूप में उपयोग कर रहा था इसलिए समस्या आ रही थी।
जोविन मिरांडा

8

POSIX-type शेल में फ़ंक्शंस का उपयोग करने की आदत डालें। आपके पास कोई भी उद्धृत समस्या नहीं है:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}

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

बिलकुल ऐसा ही है। एक फ़ाइल और स्रोत में फ़ंक्शंस डालें जो फ़ाइल
ग्लेन जैकमैन

मुझे यह मिल गया कि मैंने वास्तव में क्या किया था। कमांड "$ @" ताकि मैं फ़ाइल को निष्पादित करते समय फ़ंक्शन नाम को कॉल कर
सकूं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.