বাশ স্ক্রিপ্টে ইকো ট্যাব অক্ষর


312

আমি কীভাবে ব্যাশ স্ক্রিপ্ট ব্যবহার করে এক বা একাধিক ট্যাব অক্ষর প্রতিধ্বনিত করব? যখন আমি এই কোডটি চালাই

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

বুঝতে পেরেছি

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

উত্তর:


528
echo -e ' \t '

'স্পেস ট্যাব স্পেস নিউলাইন' প্রতিধ্বনিত করবে (এর -eঅর্থ 'ব্যাকস্ল্যাশ পলায়নের ব্যাখ্যা সক্ষম করুন'):

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

ধন্যবাদ জোহানেস আপনি আমাকে এই সমাধানটি খুঁজে পেতে সহায়তা করেছেন: res = '\ t \ t'x; প্রতিধ্বনি- ['' $ রেস ']'
কল্যাণজি

2
আপনি কি জানতে পেরেছেন, echo -eমেকফিল থেকে কেন কাজ হয় না?
dma_k

23
এর কারণ echo -eএটি পসিক্স এবং makeকলগুলি নয় /bin/shযা সাধারণত প্রোগ্রামটি ইন্টারেক্টিভভাবে ব্যবহার করে না এবং সাধারণত -eকার্যকর হয় না । বহনযোগ্যতার জন্য, printf '\t'পরিবর্তে ব্যবহার করুন।
জো তাই

ডারউইনে (ম্যাকোস) কমান্ডের manপৃষ্ঠাটিতে echoবিকল্পটি উল্লেখ করা হয়নি -e। যাইহোক, এই বিকল্পটি গ্রহণ করা হয়।
ePi272314

75

ব্যবহার printf, না echo

echoকমান্ডের একাধিক বিভিন্ন সংস্করণ রয়েছে । আছে /bin/echo(যা হতে পারে অথবা গনুহ Coreutils সংস্করণ নাও হতে পারে, সিস্টেম উপর নির্ভর করে), এবং echoকমান্ড সবচেয়ে শাঁস বিল্ট ইন থাকে। নিয়ন্ত্রণের অক্ষরের জন্য পলায়নগুলি নির্দিষ্ট করতে বা অক্ষম করার জন্য বিভিন্ন সংস্করণে বিভিন্ন উপায়ে (বা কোনও উপায় নেই)।

printfঅন্যদিকে, এর পার্থক্য অনেক কম। এটি একটি কমান্ড হিসাবে উপস্থিত থাকতে পারে, সাধারণত /bin/printf, এবং এটি কয়েকটি শাঁস (ব্যাশ এবং zsh এটি আছে, tcsh এবং ksh না) মধ্যে নির্মিত হয়েছে, তবে বিভিন্ন সংস্করণগুলির বিভিন্ন সংস্করণগুলির চেয়ে একে অপরের সাথে অনেক বেশি মিল echoরয়েছে। এবং আপনাকে কমান্ড-লাইন বিকল্পগুলি মনে রাখতে হবে না (কয়েকটি ব্যতিক্রম সহ; জিএনইউ কোরিটিলস প্রিন্টফ গ্রহণ করে --versionএবং --help, এবং বিল্ট-ইন বাশ প্রিন্টফ -v varআউটপুটটিকে একটি ভেরিয়েবলের মধ্যে সঞ্চয় করতে গ্রহণ করে)।

আপনার উদাহরণের জন্য:

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

এবং এখন আমার পক্ষে স্বীকার করার সময় এসেছে যে echoআপনি যেমন উদাহরণ হিসাবে জিজ্ঞাসা করছেন ঠিক তেমন কাজ করবে; আপনার কেবলমাত্র যুক্তির চারপাশে ডাবল উদ্ধৃতি দেওয়া দরকার:

echo "[$res]"

কিমিপ্যাপ্লান যেমন লিখেছিল (আড়াই বছর আগে, আমি কেবল লক্ষ্য করেছি!)। আপনার মূল আদেশগুলি নিয়ে সমস্যা:

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

সাথে নেই echo; এটি শেলটি এটি দেখার আগে কোনও স্থানের সাথে ট্যাবটি প্রতিস্থাপন করেছিল echo

echoযেমন সহজ আউটপুট জন্য জরিমানা echo hello world, আপনি printfযখনই আরও জটিল কিছু করতে চান আপনি ব্যবহার করা উচিত । আপনি কাজ করতে পারেন echo, তবে আপনি যখন অন্য কোনও echoবাস্তবায়ন বা অন্য কোনও শেল দিয়ে চালাবেন তখন ফলাফল কোডটি ব্যর্থ হতে পারে ।


1
আমি এটি পছন্দ করেছি, এটি আমাকে প্রিন্টফ এবং সমস্ত ফর্ম্যাট স্পেসিফায়ার জ্ঞান ব্যবহার করতে দেয়।
অরুণ 0

@ জিজেনথোমাস: এটি বেশি উত্সাহিত নয় কারণ এটি অনুরোধের চেয়ে প্রশ্নের উত্তর অন্যভাবে দেয়। প্রশ্নটিতে বিশেষত প্রতিধ্বনির উল্লেখ করা হয়েছে, এবং প্রতিধ্বনি একটি ক্রিয়া নয় বরং একটি কমান্ড।
পাওলো নেভেস 13

@ পাওলোনিভস: আমি বলব যে এটি প্রশ্নের ক্রিয়া হিসাবে ব্যবহৃত হয়েছে: "আমি কীভাবে বাশ স্ক্রিপ্ট ব্যবহার করে এক বা একাধিক ট্যাব অক্ষর প্রতিধ্বনিত করব ?"
কিথ থম্পসন

34

আপনার স্ট্রিং ডাবল উদ্ধৃতি মধ্যে রাখুন :

echo "[$res]"

1
এখানে একই - আমি এটিই চেষ্টা করেছি। যদিও আমরা ভাল কাজ করেছি
ফ্রডেরিক

2
@kmkaplan আমার জন্য zsh এ কাজ করে - আমার জন্য ব্যাসে ব্যর্থ হয়
কাল

34

আপনিও চেষ্টা করতে পারেন:

echo Hello$'\t'world.

4
আরও সাধারণ সমাধানের জন্য +1। আমি বছরের পর বছর ধরে ব্যাশ ব্যবহার করছি এবং আমি এখনই এটি শিখেছি!
আরেহ লাইব বৃষ

এটি গ্রহণযোগ্য উত্তরের চেয়ে অনেক বেশি সাধারণ কারণ এটি প্রতিধ্বনি ছাড়াই ব্যবহার করা যেতে পারে।
জওয়ান

22

প্রতিধ্বনির জন্য আপনার -e পতাকা ব্যবহার করতে হবে তবে আপনি পারবেন

echo -e "\t\t x"

16

বাশ ম্যান পৃষ্ঠা থেকে:

ফর্মের শব্দগুলি 'স্ট্রিং' বিশেষভাবে চিকিত্সা করা হয়। শব্দটি স্ট্রিংয়ে প্রসারিত হয়, এএনএসআই সি স্ট্যান্ডার্ড অনুসারে ব্যাকস্ল্যাশ-পলায়নযুক্ত অক্ষর প্রতিস্থাপন করা হয়েছিল।

সুতরাং আপনি এটি করতে পারেন:

echo $'hello\tworld'

এটি ক্লাশে কাজ করে তবে কোনও বাশ স্ক্রিপ্টে নয়?
ফ্রিক

13

ব্যবহার করুন ধারণকৃত কীস্ট্রোক, ^V( CTRL+V, C-v, যাই হোক না কেন )।

আপনি যখন টাইপ করুন ^V টার্মিনালটিতে করেন (বা বেশিরভাগ ইউনিক্স সম্পাদকদের মধ্যে), নিম্নলিখিত অক্ষরটি ভারব্যাটিম নেওয়া হয় । আপনি প্রতিধ্বনিত স্ট্রিংয়ের অভ্যন্তরে আক্ষরিক ট্যাব অক্ষরটি টাইপ করতে এটি ব্যবহার করতে পারেন।

নিম্নলিখিত কাজগুলির মতো কিছু:

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

দস্তাবেজ দস্তাবেজ ( কিউভি , "উদ্ধৃত-সন্নিবেশ")

উদ্ধৃত-সন্নিবেশ (সিকিউরিটি, সিভি) পরবর্তী অক্ষরটি আপনি টাইপ করুন যা লাইন ভার্ব্যাটিমে টাইপ করুন। উদাহরণস্বরূপ, কীভাবে কী সিকোয়েন্সগুলি সন্নিবেশ করা যায়।

পার্শ্ব নোট: এই অনুযায়ী, ALT+TAB একই জিনিস করা উচিত, কিন্তু আমরা সবাই উইন্ডো স্যুইচিংয়ের সাথে এই অনুক্রমটি আবদ্ধ করেছি যাতে আমরা এটি ব্যবহার করতে পারি না

ট্যাব-সন্নিবেশ (এম-টিএবি) একটি ট্যাব অক্ষর .োকান।

-

দ্রষ্টব্য: আপনি এই কৌশলটি সব ধরণের অস্বাভাবিক চরিত্রের সাথে ব্যবহার করতে পারেন। গাড়ীর ফেরতের মতো:

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

এর কারণ হ'ল গাড়ীর রিটার্ন ASCII 13, এবং এম বর্ণমালার 13 তম বর্ণ, সুতরাং আপনি যখন টাইপ করবেন তখন আপনি ^M13 তম ASCII অক্ষর পাবেন। আপনি এটি ls^Mখালি প্রম্পটে ব্যবহার করে ক্রিয়াকলাপে দেখতে পাচ্ছেন , যা একটি ক্যারেজ রিটার্ন সন্নিবেশ করবে, প্রম্পটটি যেমন আপনি ফিরে আসবেন ঠিক তেমনভাবে কাজ করবে। যখন এই চরিত্রগুলি সাধারণত ব্যাখ্যা করা হয়, তখন ভারব্যাটিম আপনাকে আক্ষরিক চরিত্রটি পেতে দেয়।


1
আশা করি আমি এটির জন্য আপনাকে আরও বেশি কিছু উপহার দিতে পারতাম। আমি এক্ষেত্রে আমার যুক্তিগুলিতে একটি ব্যবহার করতে চাইনি এবং এটি দুর্দান্ত কাজ করে। ধন্যবাদ!
অ্যারন আর।

"... বেশিরভাগ ইউনিক্স সম্পাদক"? এটি vi এবং ইমাস উভয় দিয়ে প্রবেশ করার চেষ্টা করেছিল এবং এটি উভয় ক্ষেত্রেই পছন্দসই ফলাফল দেয় নি।
গ্রিনম্যাট

এটা খুব সুন্দর! grepঅক্ষরযুক্ত লাইন ধরার জন্য ব্যবহার করার চেষ্টা করার সময় এবং আমার দিনটি সংরক্ষণ করেছিল tab
জোল

11

ভেরিয়েবলের মান মুদ্রণের জন্য প্রতিধ্বনি ব্যবহার করা একটি সাধারণ ব্যাশের ক্ষতি হয়। রেফারেন্স লিঙ্ক:

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


শীতল, আমি "বাশপিটফ্লস" পছন্দ করি, দুর্দান্ত টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো আমার কাজ থেকে!
জেরি টিয়ান

+1 কারণ এটি খুব সত্য। তবে লক্ষ করুন যে কল্যাণজি স্ট্রিংটি একটি "[" দিয়ে শুরু হয় এবং এতে কোনও "\" থাকে না।
কি.মি.ক্যাপ্লান

2

আপনি যদি echo "a\tb"কোনও স্ক্রিপ্টে ব্যবহার করতে চান তবে আপনি স্ক্রিপ্টটি চালান:

# sh -e myscript.sh

বিকল্পভাবে, আপনি myscript.sh এ দিতে পারেন কার্যকর করার অনুমতি এবং তারপরে স্ক্রিপ্টটি চালাতে পারেন।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.