बैश स्क्रिप्ट में इको टैब अक्षर


313

मैं बैश स्क्रिप्ट का उपयोग करके एक या अधिक टैब वर्णों को कैसे प्रतिध्वनित कर सकता हूं? जब मैं इस कोड को चलाता हूं

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

मैंने इसे प्राप्त किया

res=[ x] # that is [<space>x]

जवाबों:


529
echo -e ' \t '

गूंज जाएगा 'स्पेस टैब स्पेस न्यूलाइन' ( -eमतलब 'बैकस्लैश एस्केप की व्याख्या सक्षम करें'):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|

धन्यवाद जोहान्स। आपने मुझे यह समाधान खोजने में मदद की: res = '\ t \ t'x; echo -e '[' $ res ']'
कल्याणजी

2
क्या आपको पता है, echo -eMakefiles से काम क्यों नहीं होता है?
dma_k

23
ऐसा इसलिए echo -eहै क्योंकि POSIX और makeकॉल /bin/shनहीं है जो आम तौर पर प्रोग्राम का उपयोग इंटरएक्टिव उपयोग नहीं है, और सामान्य रूप से -eलागू नहीं होता है। पोर्टेबिलिटी के लिए, printf '\t'इसके बजाय उपयोग करें ।
जो तो

डार्विन (macOS) में, कमांड के manलिए पृष्ठ echoविकल्प का उल्लेख नहीं करता है -e। हालाँकि, यह विकल्प स्वीकार किया जाता है।
ईपी 272314

75

का उपयोग करें printf, नहीं echo

echoकमांड के कई अलग-अलग संस्करण हैं । वहाँ /bin/echo(जो सिस्टम के आधार पर GNU Coreutils संस्करण हो सकता है या नहीं भी हो सकता है), और echoकमांड अधिकांश शेल में बनाया गया है। अलग-अलग संस्करणों में नियंत्रण वर्णों के लिए पलायन को निर्दिष्ट या अक्षम करने के लिए अलग-अलग तरीके (या कोई रास्ता नहीं) हैं।

printfदूसरी ओर, बहुत कम भिन्नता है। यह एक कमांड के रूप में मौजूद हो सकता है, आम तौर पर /bin/printf, और यह कुछ गोले में निर्मित होता है (बैश और जेडश में यह है, tsh और ksh नहीं है), लेकिन विभिन्न संस्करण अलग-अलग संस्करणों की तुलना में एक दूसरे के समान echoहैं। और आपको कमांड-लाइन विकल्प (कुछ अपवादों के साथ) को याद करने की आवश्यकता नहीं है; GNU Coreutils प्रिंटफ एक्सेप्ट --versionऔर --help, और बिल्ट-इन प्रिंट प्रिंट स्वीकार करता है-v var एक वेरिएबल में आउटपुट को स्टोर करने के लिए है) याद नहीं है।

अपने उदाहरण के लिए:

res='           'x # res = "\t\tx"
printf '%s\n' "[$res]"

और अब मेरे लिए यह स्वीकार करने का समय है कि echoआप जिस उदाहरण के बारे में पूछ रहे हैं, उसके लिए भी काम करेगा; आपको बस तर्क के आसपास दोहरे उद्धरण चिह्नों की आवश्यकता है:

echo "[$res]"

के रूप में kmkaplan ने लिखा (ढाई साल पहले, मैंने अभी देखा!)। अपने मूल आदेशों के साथ समस्या:

res='           'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

साथ नहीं है echo; यह ऐसा है कि शेल ने टैब को एक स्पेस के साथ बदल दिया echoहै।

echoसरल आउटपुट के लिए ठीक है, जैसे echo hello world, लेकिन printfजब भी आप कुछ और अधिक जटिल करना चाहते हैं तो आपको इसका उपयोग करना चाहिए । आप काम करने के लिए प्राप्त कर सकते हैं echo, लेकिन परिणामी कोड विफल होने की संभावना है जब आप इसे एक अलग echoकार्यान्वयन या एक अलग शेल के साथ चलाते हैं ।


1
मुझे यह पसंद आया, यह मुझे प्रिंटफ और सभी प्रारूप निर्दिष्टकर्ताओं के ज्ञान का उपयोग करने की अनुमति देता है।
अरुण

@JezenThomas: यह अधिक अपवित्र नहीं है क्योंकि यह अनुरोध के मुकाबले दूसरे तरीके से प्रश्न का उत्तर देता है। इस प्रश्न में विशेष रूप से प्रतिध्वनि का उल्लेख किया गया है, और प्रतिध्वनि एक क्रिया नहीं बल्कि एक आदेश है।
पाउलो नेव्स

@PauloNeves: मैं कहूंगा कि यह प्रश्न में एक क्रिया के रूप में उपयोग किया जाता है: "मैं बैश स्क्रिप्ट का उपयोग करके एक या अधिक टैब वर्णों को कैसे प्रतिध्वनित कर सकता हूं ?"
कीथ थॉम्पसन 18

34

दोहरे उद्धरण चिह्नों के बीच अपनी स्ट्रिंग रखें :

echo "[$res]"

1
यहाँ वही - यही मैंने पहले प्रयास किया था।
-हालांकि

2
@kmkaplan मेरे लिए zsh में काम करता है - मेरे लिए bash में विफल रहता है
Kal

34

आप भी आजमा सकते हैं:

echo Hello$'\t'world.

4
अधिक सामान्य समाधान के लिए +1। मैं वर्षों से बैश का उपयोग कर रहा हूं और मैंने अभी यह सीखा है!
आर्येह लीब तौआरोग

यह स्वीकृत उत्तर की तुलना में बहुत अधिक सामान्य है क्योंकि इसका उपयोग बिना प्रतिध्वनि के किया जा सकता है।
17

22

आपको इको के लिए-फ्लैग का उपयोग करने की आवश्यकता है तब आप कर सकते हैं

echo -e "\t\t x"

16

बैश मैन पेज से:

फॉर्म $ 'स्ट्रिंग' के शब्दों को विशेष रूप से व्यवहार किया जाता है। यह शब्द ANSI C मानक द्वारा निर्दिष्ट बैकस्लैश-एस्कैप्ड वर्णों के साथ स्ट्रिंग में फैलता है।

तो आप यह कर सकते हैं:

echo $'hello\tworld'

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

13

का प्रयोग करें शब्दशः कीस्ट्रोक, ^V( CTRL+V, C-v, जो कुछ भी )।

जब आप ^Vटर्मिनल (या अधिकांश यूनिक्स संपादकों) में टाइप करते हैं, तो निम्न वर्ण शब्दशः लिया जाता है । आप इसे एक स्ट्रिंग के अंदर शाब्दिक टैब वर्ण टाइप करने के लिए उपयोग कर सकते हैं जिसे आप गूँज रहे हैं।

निम्नलिखित कार्यों की तरह कुछ:

echo "^V<tab>"     # CTRL+V, TAB

बैश डॉक्स ( qv , "उद्धृत-डालें")

quoted-insert (Cq, Cv) अगला वर्ण जो आप लाइन वर्बेटिम में लिखते हैं, जोड़ें। उदाहरण के लिए, Cq जैसे प्रमुख अनुक्रम सम्मिलित करना है।

साइड नोट: इस के अनुसार, ALT+TAB एक ही काम करना चाहिए, लेकिन हम सभी उस क्रम को विंडो स्विचिंग के लिए बाध्य करते हैं ताकि हम इसका उपयोग न कर सकें

टैब-इन्सर्ट (M-TAB) एक टैब कैरेक्टर डालें।

-

नोट: आप सभी प्रकार के असामान्य पात्रों के साथ इस रणनीति का उपयोग कर सकते हैं। गाड़ी वापसी की तरह:

echo "^V^M"        # CTRL+V, CTRL+M

ऐसा इसलिए है क्योंकि गाड़ी वापसी ASCII 13 है, और M वर्णमाला का 13 वां अक्षर है, इसलिए जब आप टाइप करते हैं, तो आपको ^M13 वां ASCII वर्ण मिलता है। आप इसे ls^Mखाली प्रॉम्प्ट पर एक्शन का उपयोग करते हुए देख सकते हैं , जो एक गाड़ी रिटर्न को सम्मिलित करेगा, जिससे प्रॉम्प्ट ठीक उसी तरह काम करेगा जैसे आप रिटर्न मारते हैं। जब इन पात्रों की आम तौर पर व्याख्या की जाती है, तो शब्दशः आपको शाब्दिक चरित्र मिल जाता है।


1
काश मैं तुम्हें इस के लिए और अधिक upvotes दे सकता। मैं इस मामले में अपने तर्कों का उपयोग नहीं करना चाहता था, और यह बहुत अच्छा काम करता है। धन्यवाद!
आरोन आर।

"... सबसे यूनिक्स संपादक"? Vi और emacs दोनों के साथ इसे दर्ज करने की कोशिश की और इसने या तो वांछित परिणाम नहीं दिए।
ग्रीनमैट

यह soooo अच्छा है! और पात्रों grepको पकड़ने वाली लाइनों को पकड़ने के लिए उपयोग करने की कोशिश करते समय मेरा दिन बचाया tab
जोएल

11

वैरिएबल के मानों को प्रिंट करने के लिए इको का उपयोग करना एक सामान्य बैश नुकसान है। संदर्भ लिंक:

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo


कूल, मुझे "बैशपिटैल्स" पसंद है, सामग्री का एक बड़ा टुकड़ा और मेरे दैनिक काम से बहुत दर्द को कम करता है!
जेरी तियान

+1 क्योंकि यह sooo true है। लेकिन ध्यान दें कि कल्याणजी स्ट्रिंग एक "[" से शुरू होता है और इसमें कोई "\" नहीं होता है।
किमीकपलान

2

यदि आप echo "a\tb"किसी स्क्रिप्ट में उपयोग करना चाहते हैं , तो आप स्क्रिप्ट को इस रूप में चलाते हैं:

# sh -e myscript.sh

वैकल्पिक रूप से, आप myscript.sh को निष्पादन अनुमति दे सकते हैं, और फिर स्क्रिप्ट चला सकते हैं।

# chmod +x myscript.sh
# ./myscript.sh

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