कंसोल आउटपुट में मेरी स्क्रिप्ट प्रमुख व्हाट्सएप को क्यों छोड़ती है?


10

मेरे पास निम्न स्क्रिप्ट है:

#!/bin/bash
function consoleWriteLine() {
  echo $* >&2
}

consoleWriteLine "    indented by 4 spaces"

जब मैं इसे चलाता हूं, तो मुझे निम्न आउटपुट मिलते हैं:

$ ./test.sh
indented by 4 spaces

मेरे 4 स्थान कहां गए? और मैं उन्हें वापस कैसे ले सकता हूं?

जवाबों:


22

बस echoअपने समारोह में बोली :

function consoleWriteLine() {
  echo "$*" >&2
}

echoअंतरिक्ष द्वारा अलग किए गए सिर्फ कई तर्क और उन्हें एक ही स्थान द्वारा अलग किए गए प्रिंट । देख:

$ echo a b c
a b c
$ echo a b             c
a b c
$ echo "a b             c"
a b             c

पिछले उदाहरण में स्ट्रिंग a b cहै एक एकल तर्क और echoएड के रूप में यह है।


मेरे लिए यहां समझने की कुंजी यह थी कि शुरू में तर्क को उद्धृत करते हुए केवल व्हाट्सएप को संरक्षित किया जाएगा जब तक कि इसे पारित नहीं किया जाता है consoleWriteLine। दूसरी बार यह echoघ है, व्हॉट्सएप को फिर से अतिरिक्त उद्धरण द्वारा संरक्षित करने की आवश्यकता है। मैंने कभी अनुमान नहीं लगाया होगा कि आप उद्धरणों को चारों ओर रख सकते हैं $*
डेर होकस्टाप्लर

4
न केवल आप उद्धरण को चारों ओर रख सकते हैं $*, $@विशेष रूप से अलग-अलग शब्दों में विस्तार करने के लिए बनाया गया था जब उद्धृत किया गया हो: "$@"कई तर्क हो सकते हैं, "$*"हमेशा एक होता है। echoउन कुछ आदेशों में से एक है जहां इससे कोई अंतर नहीं पड़ता है।
एलेक्सिस

4

इस समस्या को खुद था,

इस ब्लॉग के अनुसार, आपको IFS को बदलने की आवश्यकता है क्योंकि डिफ़ॉल्ट रूप से इसमें सफेद स्थान होता है और इसलिए "xxx yyy zzzz" को उनके बीच सफेद स्थान के साथ 3 तार के रूप में देखता है।

IFS='\n'

आदेश से पहले इसे ठीक कर देंगे, और परिवर्तन को हटाने के लिए IFS को परेशान करेंगे

unset IFS


2
यह काम कर रहा है, लेकिन स्वीकृत समाधान (उद्धरण जोड़ते हुए) बहुत अधिक है।
कैसरसोल

नहीं, मैंने देखा कि यह उद्धृत नहीं किया गया था। ओह! : D
djsmiley2kStaysInside
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.