एक समारोह में $ 1 स्क्रिप्ट के पहले तर्क को क्यों नहीं छाप रहा है?


13

इस सरल बैश स्क्रिप्ट में echo $1प्रिंट क्यों नहीं होता है $1?

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

6
क्योंकि आप $ 1 भूल गए थे जब print_something को कॉल कर रहे थे। कृपया प्रश्न में पाठ को शामिल करने का प्रयास करें न कि शीर्षक में।
रुई एफ रिबेरो

धन्यवाद। अगर स्क्रिप्ट को कमांड्स में सम्मिलित करने की आवश्यकता है तो इको तर्क क्या होना चाहिए: Print_something "$ 1"; प्रिंट_समर्थन "$ 2"; और शायद अधिक?
पिएत्रो लेटी

13
जब मैंने HNQ में यह देखा तो मुझे लगा कि आप डॉलर-बिलों की छपाई कर रहे हैं और कुछ रसदार कहानी पढ़ने की उम्मीद करते हैं कि आपका प्रिंटर कैसे पता लगाता है कि आप नकली पैसे छाप रहे हैं।
पाइप

@ मेरे पास जो कुछ भी हुआ है उससे पहले, किसी न किसी कारण से यह कुछ भी छापने से इंकार नहीं करता है, न कि एंटी-प्रिंटिंग रोकथाम के साथ।
कोडिंगेल

जवाबों:


41

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

print_something Something

वास्तव में प्रिंट होगा Something

यदि आप स्क्रिप्ट के तर्कों को किसी फ़ंक्शन में पास करना चाहते हैं, तो आपको यह स्पष्ट रूप से करना होगा। उपयोग

print_something "$1"

पहला तर्क पारित करने के लिए, या

print_something "$@"

उन सभी को पारित करने के लिए, हालांकि उदाहरण में फ़ंक्शन केवल पहले वाले का उपयोग करता है।


1
पास "$@"करना print_something, जैसा कि वर्तमान में लिखा गया है, अभी भी केवल तर्कों के पहले प्रिंट करेगा।
Kusalananda

13
लेकिन मुद्दा यह था कि सभी तर्कों को कैसे पारित किया जाए , मुझे लगता है। तथ्य यह है कि फ़ंक्शन, जैसा कि यह खड़ा है, केवल अपने तर्कों का उपयोग करता है थोड़ा अप्रासंगिक है।
अजीब

ठीक है, सिर्फ यह सोचकर कि सभी तर्कों को पारित करने का कोई मतलब नहीं है अगर केवल पहले एक का उपयोग किया जा रहा है।
Kusalananda

14
@ अलो नं। "$*"एक एकल स्ट्रिंग होगी (पहले चरित्र में शामिल $IFS), जबकि "$@"व्यक्तिगत रूप से उद्धृत तत्वों की एक सूची होगी।
Kusalananda

5
@ कुसलानंद किसी ऐसे व्यक्ति को बताने का बिंदु जो प्रयोग करने के लिए कमांड-लाइन मापदंडों को किसी फ़ंक्शन में पास करना चाहता है "$@", भले ही इस मामले में ऐसा एक ही पैरामीटर हो, ऐसे सभी मामलों को कवर करना है। यदि ओपी एक दूसरा पैरामीटर जोड़ने का फैसला करता है, तो फ़ंक्शन मंगलाचरण में परिवर्तन करने के लिए कुछ भी नहीं है। और बाकी सभी जो इसे पढ़ते हैं, वे इसे फिर से करने से बचने के लिए इसे करने का सही तरीका सीखेंगे, बाद में भी।
मोंटी हार्डर

10

इसका कारण यह है कि एक फ़ंक्शन को अपने माता-पिता / कॉलर के सेट से स्वतंत्र स्थितीय मापदंडों का अपना सेट मिलता है। प्रयत्न

print_something "$1"

(और echo "$1", या इससे भी बेहतर printf '%s\n' "$1", पैरामीटर विस्तार को उद्धृत करना याद रखें और जिसका echoउपयोग मनमाने डेटा के लिए नहीं किया जा सकता है)।


आपको स्पष्ट होने की आवश्यकता है कि आप किस बारे में बात कर रहे हैं। कॉलर $1आमतौर पर फ़ंक्शन से भिन्न होता है $1, हालांकि यदि वे ऊपर प्रस्तावित की तरह उपयोग किए जाते हैं तो वे समान हो सकते हैं। यदि मैं आपको सही echoecho $1print_something $2$1
पाता

6
echo $1जब तक आप $1विस्तार के लिए फ़ाइल पैटर्न की $ IFS- सीमांकित सूची के रूप में व्यवहार नहीं करना चाहते हैं, तब तक उपयोग करने का कोई मतलब नहीं है । echo "$1"अधिक समझ में आता है, हालांकि जैसे के $1मूल्यों के लिए सामग्री का उत्पादन नहीं होगा , ...$1-nene-EE
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.