سؤال

كيف يمكنني صدى واحدة أو أكثر التبويب الأحرف باستخدام باش السيناريو ؟ عند تشغيل هذه التعليمات البرمجية

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

أحصل على هذا

res=[ x] # that is [<space>x]
هل كانت مفيدة؟

المحلول

echo -e ' \t '

وسوف اردد "السطر الفضاء التبويب الفضاء" (-e يعني 'تمكين تفسير مائل يهرب'):

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

نصائح أخرى

استخدم printf، وليس echo.

وهناك عدة إصدارات مختلفة من الأمر echo. هناك /bin/echo (التي قد تكون أو لا تكون النسخة GNU Coreutils، اعتمادا على النظام)، وبنيت الأمر echo في معظم القذائف. إصدارات مختلفة وبطرق مختلفة (أو أي وسيلة) لتحديد أو تعطيل هروب لأحرف التحكم.

وprintf، من ناحية أخرى، لديها أقل بكثير الاختلاف. يمكن أن يكون موجودا كأمر، /bin/printf عادة، وانها بنيت في بعض قذائف (باش و zsh يكون ذلك، إلى tcsh وKSH لا)، ولكن الإصدارات المختلفة هي أكثر ما شابه الكثير من بعضها البعض من الإصدارات المختلفة من echo هي. ولم يكن لديك أن نتذكر خيارات سطر الأوامر (مع وجود استثناءات قليلة، GNU Coreutils printf يقبل --version و--help، والمدمج في printf باش يقبل -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 مختلف أو قذيفة مختلفة.

وضع سلسلة بين مزدوج يقتبس:

echo "[$res]"

ويمكنك أيضا محاولة:

echo Hello$'\t'world.

وتحتاج إلى استخدام العلم -e لصدى ثم يمكنك

echo -e "\t\t x"

ومن صفحة باش الرجل:

<اقتباس فقرة>   

ويتم التعامل مع الكلمات من 'سلسلة' شكل $ خصيصا. كلمة تتوسع إلى سلسلة، مع شخصيات نجا مائل استبدال كما هو محدد بواسطة معيار ANSI C.

وهكذا يمكنك القيام بذلك:

echo $'hello\tworld'

وعن طريق صدى لطباعة قيم المتغيرات هو شرك باش المشترك. مرجع الارتباط:

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

استخدام الحرفية ضغطة ، ^V (CTRL+V, C-v, مهما كان).

عندما كنت اكتب ^V في محطة (أو في معظم Unix المحررين), الأحرف التالية يؤخذ الحرفية.يمكنك استخدام هذا النوع الحرفي التبويب حرف داخل سلسلة كنت مرددا.

شيء مثل الأعمال التالية:

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

باش مستندات (qv, "نقلا عن إدراج")

ونقلت-إدراج (ج-س, C-v) إضافة الحرف التالي الذي تكتبه إلى خط الحرفية.هذا هو كيفية إدراج مفتاح تسلسل مثل C-q على سبيل المثال.

ملاحظة جانبية:وفقا لهذا ، ALT+TAB يجب أن تفعل الشيء نفسه, ولكن كلنا لا بد أن تسلسل نافذة التبديل لذا لا يمكننا استخدامه

علامة التبويب "إدراج" (M-TAB) إدراج علامة التبويب حرف.

--

ملاحظة:يمكنك استخدام هذه الاستراتيجية مع جميع أنواع الشخصيات غير عادية.مثل إرجاع:

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

لأن هذا هو إرجاع هو ASCII 13 ، م هو 13 حرف من الأبجدية, حتى عندما كنت اكتب ^M, يمكنك الحصول على 13 حرف ASCII.يمكنك أن ترى أنه في العمل باستخدام ls^M, في فارغة موجه ، والتي سيتم إدراج إرجاع ، مما تسبب في موجه إلى قانون مثلك ضرب العودة.عند هذه الشخصيات عادة تفسير ، الحرفية يحصل لك الحصول على الطابع الحرفي.

إذا كنت تريد استخدام echo "a\tb" في السيناريو، تشغيل البرنامج النصي على النحو التالي:

# sh -e myscript.sh

وبدلا من ذلك، يمكنك ان تعطي لmyscript.sh إذن التنفيذ، ثم قم بتشغيل البرنامج النصي.

# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top