आपके खोल उद्धरणों की व्याख्या कर रहे हैं, दोनों '
और "
, इससे पहले कि वे भी प्राप्त करें echo
। मैं आमतौर पर अपने तर्क के इर्द-गिर्द दोहरा उद्धरण लगाता हूं, भले ही वे अनावश्यक हों; उदाहरण के लिए:
$ echo "Hello world"
Hello world
इसलिए अपने पहले उदाहरण में, यदि आप अपने आउटपुट में शाब्दिक उद्धरण चिह्नों को शामिल करना चाहते हैं, तो उन्हें या तो बच जाना चाहिए:
$ echo \'Hello world\'
'Hello world'
या उन्हें पहले से ही एक उद्धृत तर्क के भीतर उपयोग करने की आवश्यकता है (लेकिन यह उसी तरह का उद्धरण नहीं हो सकता है, या आपको इसे वैसे भी बचने की आवश्यकता होगी):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
अपने दूसरे उदाहरण में, आप स्ट्रिंग के बीच में कमांड प्रतिस्थापन चला रहे हैं:
grep $ARG /var/tmp/setfile | awk {print $2}
$
जिन चीजों के साथ शुरुआत होती है उन्हें विशेष रूप से शेल द्वारा नियंत्रित किया जाता है - यह उन्हें चर के रूप में मानता है और उन्हें अपने मूल्यों के साथ बदल देता है। चूँकि सबसे अधिक संभावना है कि उनमें से कोई भी चर आपके शेल में सेट नहीं है, यह वास्तव में बस चलता है
grep /var/tmp/setfile | awk {print}
चूँकि grep
केवल एक तर्क को देखता है, यह मानता है कि तर्क वह पैटर्न है जिसे आप खोज रहे हैं, और यह कि जिस स्थान से इसे डेटा पढ़ना चाहिए वह स्टडिन है, इसलिए यह इनपुट की प्रतीक्षा कर रहा है। इसलिए आपका दूसरा कमांड सिर्फ लटका हुआ प्रतीत होता है।
यदि आप तर्क को एकल-उद्धरण करते हैं (तो यही कारण है कि आपका पहला उदाहरण लगभग काम किया है) तो ऐसा नहीं होगा, इसलिए यह वह तरीका है जो आपको प्राप्त होता है:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
आप इसे डबल-कोट भी कर सकते हैं, लेकिन फिर आपको $
एस से बचना होगा इसलिए शेल उन्हें चर के रूप में हल नहीं करता है, और बैकटिक्स इसलिए शेल कमांड प्रतिस्थापन को तुरंत नहीं चलाता है:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"