বাশ ব্যবহার করার সময় কোন চরিত্রগুলি পালাতে হবে?


206

বাশে পালানোর দরকার আছে এমন কোনও অক্ষরের তালিকা রয়েছে কি? এটা ঠিক সঙ্গে চেক করা যেতে পারেsed ?

বিশেষত, আমি যাচাই করা দরকার কিনা তা পরীক্ষা করে %দেখছিলাম। আমি চেষ্টা করেছিলাম

echo "h%h" | sed 's/%/i/g'

এবং অব্যাহতি ছাড়াই ভাল কাজ করে %। এটা মানে% দরকার নেই? প্রয়োজনীয়তা যাচাই করার জন্য এটি কি ভাল উপায় ছিল?

এবং আরও সাধারণ: তারা পালাতে একই অক্ষর shellএবং bash?


4
সাধারণভাবে, যদি আপনি যত্ন নেন তবে আপনি এটি ভুল করছেন। হ্যান্ডলিং ডেটা কখনই কোডের জন্য ব্যবহৃত বিশ্লেষণ এবং মূল্যায়ন প্রক্রিয়াটির মধ্য দিয়ে চলমান শাবক তৈরি করে চালানো জড়িত না। এটি এসকিউএল-র জন্য সর্বোত্তম অনুশীলনের খুব কাছাকাছি সমান্তরাল - যেখানে ডাইন্ড থিংটি বাইন্ড ভেরিয়েবলগুলি ব্যবহার করা এবং রাইং থিংটি স্ট্রিং বিকল্পগুলির মাধ্যমে ইনজেকশন করা ডেটা "স্যানিটাইজ" করার চেষ্টা করা হয়।
চার্লস ডাফি

সঙ্গে সম্পর্কিত stackoverflow.com/questions/2854655/...
skywinder

8
@ চার্লসডুফি হ্যাঁ, তবে কখনও কখনও প্রস্তুত বিবৃতি ইঞ্জিন ব্যাকএন্ডে যা করছে তা কেবল জিনিসগুলি এড়িয়ে চলেছে। ব্রাউজারে প্রদর্শিত হওয়ার আগে তারা ব্যবহারকারী-জমা দেওয়া মন্তব্যে পালিয়ে যাওয়ার কারণে এসও কি এটি "ভুল করছে"? না তারা এক্সএসএস প্রতিরোধ করছে। মোটেও যত্ন নিচ্ছেন না এটি ভুল করছেন।
পার্থিয়ান শট

@ পার্থিয়ানশট, যদি প্রস্তুত বিবৃতি ইঞ্জিনটি কোড থেকে ডেটা পুরোপুরি বাইরে না রাখে তবে যারা লিখেছেন তাদের গুলি করা উচিত। হ্যাঁ, আমি জানি মাইএসকিউএলের তারের প্রোটোকলটি সেভাবে কার্যকর করা হয়েছে; আমার বক্তব্য দাঁড়িয়েছে।
চার্লস ডাফি

@ চার্লসডুফি এবং আমার বক্তব্য- কখনও কখনও আপনার বিকল্পগুলি এমন একটি সরঞ্জামচেন ব্যবহার করে নিরাপদে কিছু কাজ করা যা একটি পিউরিস্ট ক্রিঞ্জ তৈরি করতে পারে, বা আটবার সময় এবং প্রচেষ্টাটিকে ডুবিয়ে দেয় সুন্দর করে তোলে - এটি এখনও দাঁড়িয়ে আছে।
পার্থিয়ান শট

উত্তর:


282

দুটি সহজ এবং নিরাপদ নিয়ম রয়েছে যা কেবলমাত্র নয় কেবল shতাও কার্যকর bash

1. সম্পূর্ণ স্ট্রিংটি একক উদ্ধৃতিতে রাখুন

এটি একক উদ্ধৃতি নিজেই বাদে সমস্ত চরিত্রের জন্য কাজ করে। একক উদ্ধৃতি থেকে বাঁচতে, এর আগে উদ্ধৃতিটি বন্ধ করুন, একক উদ্ধৃতি সন্নিবেশ করুন এবং উদ্ধৃতিটি আবার খুলুন।

'I'\''m a s@fe $tring which ends in newline
'

সিড কমান্ড: sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/"

২. প্রতিটি চরকে ব্যাকস্ল্যাশ দিয়ে পালাতে হবে

এটি নিউলাইন বাদে সমস্ত চরিত্রের জন্য কাজ করে। নতুন লাইনের অক্ষরের জন্য একক বা ডাবল উদ্ধৃতি ব্যবহার করুন। খালি স্ট্রিংগুলি এখনও পরিচালনা করতে হবে - এর সাথে প্রতিস্থাপন করুন""

\I\'\m\ \a\ \s\@\f\e\ \$\t\r\i\n\g\ \w\h\i\c\h\ \e\n\d\s\ \i\n\ \n\e\w\l\i\n\e"
"

কিন্তু কমান্ড প্রয়োগ করুন: sed -e 's/./\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'

2b। আরও পঠনযোগ্য সংস্করণ 2

অক্ষরের একটি সহজ সুরক্ষিত সেট রয়েছে [a-zA-Z0-9,._+:@%/-], যা এটিকে আরও পঠনযোগ্য রাখার জন্য অবিচ্ছিন্ন রেখে দেওয়া যেতে পারে

I\'m\ a\ s@fe\ \$tring\ which\ ends\ in\ newline"
"

কিন্তু কমান্ড প্রয়োগ করুন: LC_ALL=C sed -e 's/[^a-zA-Z0-9,._+@%/-]/\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'


নোট করুন যে একটি সিড প্রোগ্রামে, কেউ জানতে পারে না যে ইনপুটটির শেষ লাইনটি একটি নতুন লাইন বাইট দিয়ে শেষ হয় (খালি থাকা ব্যতীত)। উপরের উভয় সেড কমান্ড এটি ধরে না বলে ধরে নেওয়া হয়। আপনি ম্যানুয়ালি উদ্ধৃত নিউলাইন যোগ করতে পারেন।

নোট করুন যে শেল ভেরিয়েবলগুলি কেবল পসিক্স অর্থে পাঠ্যের জন্য সংজ্ঞায়িত করা হয়। বাইনারি ডেটা প্রক্রিয়াকরণ সংজ্ঞায়িত করা হয় না। গুরুত্বপূর্ণ বাস্তবায়নের জন্য, বাইনারি NUL বাইট ব্যতীত কাজ করে (কারণ ভেরিয়েবলগুলি সি স্ট্রিং সহ প্রয়োগ করা হয়, এবং এটি সি স্ট্রিং হিসাবে ব্যবহৃত হতে পারে, যেমন প্রোগ্রাম আর্গুমেন্ট), তবে আপনাকে "বাইনারি" লোকালে যেমন ল্যাটিন 1 এ স্যুইচ করতে হবে ।


(আপনি shপোসিক্স স্পেসটি পড়ে সহজেই বিধিগুলি যাচাই করতে পারেন b ব্যাশের জন্য, @ অস্টিনফিলিপস সংযুক্ত রেফারেন্স ম্যানুয়ালটি পরীক্ষা করুন)


দ্রষ্টব্য: # 1 তে একটি ভাল পার্থক্য এখানে মৌমাছি দেখতে পাওয়া যায়: github.com/scop/bash-completion/blob/… । এটি চলমান প্রয়োজন হয় না sed, কিন্তু প্রয়োজন bash
jwd

4
অন্য কারও জন্য নোট করুন (আমার মতো!) যারা এই কাজ করার জন্য লড়াই করে .... মনে হয় আপনি ওএসএক্সে পেয়ে যাওয়া সেটের গন্ধগুলি এই সেড কমান্ডগুলি সঠিকভাবে চালায় না। তারা লিনাক্সে যদিও ভাল কাজ!
ডালেলেন

@ ড্যালেন: এখানে পরীক্ষা করা যায় না। আপনার যখন উভয়টিতে কাজ করে এমন সংস্করণ থাকবে তখন সম্পাদনা করুন।
জো সো

দেখে মনে হচ্ছে আপনার স্ট্রিংটি '-' (বিয়োগ) দিয়ে শুরু হওয়া উচিত, বা এটি কেবল ফাইলনামগুলিতে প্রয়োগ হয়? - পরবর্তী ক্ষেত্রে সামনে './' দরকার।
স্ল্যাশমেজ

আপনি কি বোঝাতে চাচ্ছেন তা আমি নিশ্চিত নই. এই সেড কমান্ডগুলির সাহায্যে স্ট্যান্ডিন থেকে ইনপুট স্ট্রিং নেওয়া হয়।
জো সো

59

ফর্ম্যাট যা শেল ইনপুট হিসাবে পুনরায় ব্যবহার করা যেতে পারে

এই জাতীয় অনুরোধের জন্য একটি বিশেষ printf ফর্ম্যাট নির্দেশিকা ( %q) নির্মিত হয়েছে:

printf [-v var] ফর্ম্যাট [যুক্তি]

 %q     causes printf to output the corresponding argument
        in a format that can be reused as shell input.

কিছু নমুনা:

read foo
Hello world
printf "%q\n" "$foo"
Hello\ world

printf "%q\n" $'Hello world!\n'
$'Hello world!\n'

এটি ভেরিয়েবলের মাধ্যমেও ব্যবহার করা যেতে পারে:

printf -v var "%q" "$foo
"
echo "$var"
$'Hello world\n'

সমস্ত (128) এস্কি বাইট সহ দ্রুত চেক করুন:

মনে রাখবেন যে 128 থেকে 255 এর সমস্ত বাইটগুলি এড়িয়ে যেতে হবে।

for i in {0..127} ;do
    printf -v var \\%o $i
    printf -v var $var
    printf -v res "%q" "$var"
    esc=E
    [ "$var" = "$res" ] && esc=-
    printf "%02X %s %-7s\n" $i $esc "$res"
done |
    column

এটি অবশ্যই এর মতো কিছু রেন্ডার করবে:

00 E ''         1A E $'\032'    34 - 4          4E - N          68 - h      
01 E $'\001'    1B E $'\E'      35 - 5          4F - O          69 - i      
02 E $'\002'    1C E $'\034'    36 - 6          50 - P          6A - j      
03 E $'\003'    1D E $'\035'    37 - 7          51 - Q          6B - k      
04 E $'\004'    1E E $'\036'    38 - 8          52 - R          6C - l      
05 E $'\005'    1F E $'\037'    39 - 9          53 - S          6D - m      
06 E $'\006'    20 E \          3A - :          54 - T          6E - n      
07 E $'\a'      21 E \!         3B E \;         55 - U          6F - o      
08 E $'\b'      22 E \"         3C E \<         56 - V          70 - p      
09 E $'\t'      23 E \#         3D - =          57 - W          71 - q      
0A E $'\n'      24 E \$         3E E \>         58 - X          72 - r      
0B E $'\v'      25 - %          3F E \?         59 - Y          73 - s      
0C E $'\f'      26 E \&         40 - @          5A - Z          74 - t      
0D E $'\r'      27 E \'         41 - A          5B E \[         75 - u      
0E E $'\016'    28 E \(         42 - B          5C E \\         76 - v      
0F E $'\017'    29 E \)         43 - C          5D E \]         77 - w      
10 E $'\020'    2A E \*         44 - D          5E E \^         78 - x      
11 E $'\021'    2B - +          45 - E          5F - _          79 - y      
12 E $'\022'    2C E \,         46 - F          60 E \`         7A - z      
13 E $'\023'    2D - -          47 - G          61 - a          7B E \{     
14 E $'\024'    2E - .          48 - H          62 - b          7C E \|     
15 E $'\025'    2F - /          49 - I          63 - c          7D E \}     
16 E $'\026'    30 - 0          4A - J          64 - d          7E E \~     
17 E $'\027'    31 - 1          4B - K          65 - e          7F E $'\177'
18 E $'\030'    32 - 2          4C - L          66 - f      
19 E $'\031'    33 - 3          4D - M          67 - g      

যেখানে প্রথম ক্ষেত্রটি হ'ল বাইটের মান, সেখানে দ্বিতীয় Eঅক্ষরটি যদি পালাতে হয় এবং তৃতীয় ক্ষেত্রের চরিত্রের উপস্থাপনা থেকে বাঁচতে হয় contain

কেন ,?

আপনি কিছু অক্ষর আছে যা না দেখতে পারে সবসময় , পলান করা মত প্রয়োজন ,, }এবং {

তাই সবসময় না তবে কিছু সময় :

echo test 1, 2, 3 and 4,5.
test 1, 2, 3 and 4,5.

অথবা

echo test { 1, 2, 3 }
test { 1, 2, 3 }

তবে যত্ন:

echo test{1,2,3}
test1 test2 test3

echo test\ {1,2,3}
test 1 test 2 test 3

echo test\ {\ 1,\ 2,\ 3\ }
test  1 test  2 test  3

echo test\ {\ 1\,\ 2,\ 3\ }
test  1, 2 test  3 

এটিতে সমস্যাটি রয়েছে যে, বাশ / শের মাধ্যমে প্রিটনফকে কল করে স্ট্রিংটি প্রথমে বাশ /
শের

1
@ থারস্মমনার, আপনি যদি আলাদা ভাষা থেকে শেলটির আক্ষরিক যুক্তি হিসাবে স্ট্রিংটি পাস করেন না (যেখানে আপনি সম্ভবত উদ্ধৃতি দিতে ইতিমধ্যে জানেন) know পাইথনে: subprocess.Popen(['bash', '-c', 'printf "%q\0" "$@"', '_', arbitrary_string], stdin=subprocess.PIPE, stdout=subprocess.PIPE).communicate()আপনাকে সঠিকভাবে শেল-কোটড সংস্করণ দেবে arbitrary_string
চার্লস ডাফি

1
এফওয়াইআই বাশের %qদীর্ঘদিনের জন্য নষ্ট হয়ে গেছে - যদি আমার মন আমার ভাল সেবা করে তবে একটি ত্রুটি ঠিক করা হয়েছিল (তবে এখনও ভেঙে যেতে পারে) ~ 10 বছর ভেঙে যাওয়ার পরে। সুতরাং এটির উপর নির্ভর করবেন না।
জো সো

@ চার্লসডুফি অবশ্যই, আপনি একবার পাইথন জমিতে চলে গেলে, shlex.quote()(> = 3.3, pipes.quote()- অপ্রকাশিত - পুরানো সংস্করণগুলির জন্য) এছাড়াও কাজটি করবে এবং বেশিরভাগ স্ট্রিংয়ের আরও একটি মানব-পঠনযোগ্য সংস্করণ (উদ্ধৃতি যুক্ত এবং প্রস্থান, প্রয়োজন হিসাবে) তৈরি করবে, শেল স্প্যান প্রয়োজন ছাড়া।
টমাস পার্ল

1
সম্পর্কে বিশেষ নোট যোগ করার জন্য আপনাকে ধন্যবাদ ,। বিল্ট-ইন বাশ printf -- %q ','দেয় তা শিখতে পেরে আমি অবাক হয়েছি \,, কিন্তু /usr/bin/printf -- %q ','দেয় ,(অনাবৃত)। অন্যান্য অক্ষর জন্য একই: {, |, }, ~
কেভিনার্পে

34

আরটিএফএম করা থেকে অন্য কাউকে বাঁচাতে ... ব্যাশে :

ডবল কোট অক্ষর আবদ্ধ কোট মধ্যে সব অক্ষরের আক্ষরিক মান অপরিবর্তিত, ব্যতিক্রম $, `, \, এবং, যখন ইতিহাস সম্প্রসারণ সক্ষম হলে, !

... সুতরাং যদি আপনি সেগুলি (এবং নিজেই উদ্ধৃতি অবশ্যই) থেকে অবরুদ্ধ হন তবে আপনি সম্ভবত ঠিক আছেন।

যদি সন্দেহ হয়, এড়ানোর জন্য আপনি যদি আরও বেশি রক্ষণশীল হন তবে পরিচয়কারী অক্ষরগুলি (যেমন ASCII অক্ষর, সংখ্যা বা '_') এড়িয়ে না গিয়ে বিশেষ অর্থ সহ পরিবর্তে অক্ষরগুলি পাওয়া এড়ানো সম্ভব হবে। এগুলি কখনই (যেমন কিছু অদ্ভুত পসিক্স-ইশ শেলের মধ্যে রয়েছে) এর বিশেষ অর্থ থাকবে এবং তাই এড়াতে হবে very


1
উপরে বর্ণিত ম্যানুয়ালটি এখানে: gnu.org/software/bash/manual/html_node/Double-Quotes.html
Code_monk

এটি একটি সংক্ষিপ্ত, মিষ্টি এবং বেশিরভাগ সঠিক উত্তর (এর জন্য +1) তবে একক উদ্ধৃতি ব্যবহার করা আরও ভাল - আমার দীর্ঘ উত্তরটি দেখুন।
জো সো

26

print '%q' কৌশলটি ব্যবহার করে , আমরা কোন অক্ষর বিশেষ তা খুঁজে পেতে একটি লুপ চালাতে পারি:

#!/bin/bash
special=$'`!@#$%^&*()-_+={}|[]\\;\':",.<>?/ '
for ((i=0; i < ${#special}; i++)); do
    char="${special:i:1}"
    printf -v q_char '%q' "$char"
    if [[ "$char" != "$q_char" ]]; then
        printf 'Yes - character %s needs to be escaped\n' "$char"
    else
        printf 'No - character %s does not need to be escaped\n' "$char"
    fi
done | sort

এটি এই আউটপুট দেয়:

No, character % does not need to be escaped
No, character + does not need to be escaped
No, character - does not need to be escaped
No, character . does not need to be escaped
No, character / does not need to be escaped
No, character : does not need to be escaped
No, character = does not need to be escaped
No, character @ does not need to be escaped
No, character _ does not need to be escaped
Yes, character   needs to be escaped
Yes, character ! needs to be escaped
Yes, character " needs to be escaped
Yes, character # needs to be escaped
Yes, character $ needs to be escaped
Yes, character & needs to be escaped
Yes, character ' needs to be escaped
Yes, character ( needs to be escaped
Yes, character ) needs to be escaped
Yes, character * needs to be escaped
Yes, character , needs to be escaped
Yes, character ; needs to be escaped
Yes, character < needs to be escaped
Yes, character > needs to be escaped
Yes, character ? needs to be escaped
Yes, character [ needs to be escaped
Yes, character \ needs to be escaped
Yes, character ] needs to be escaped
Yes, character ^ needs to be escaped
Yes, character ` needs to be escaped
Yes, character { needs to be escaped
Yes, character | needs to be escaped
Yes, character } needs to be escaped

কিছু ফলাফল যেমন ,দেখতে কিছুটা সন্দেহজনক। এটিতে @ চার্লসডফির ইনপুটগুলি আকর্ষণীয় হবে।


2
আপনি আমার উত্তরের শেষ অনুচ্ছেদে ,কিছুটা সন্দেহজনক দেখাতে উত্তরটি পড়তে পারেন
এফ হৌরি

2
মনে রেখ যে %q শেলটির মধ্যে আপনি কোথায় অক্ষরটি ব্যবহার করার পরিকল্পনা করছেন তা জানেন না, সুতরাং এটি এমন সমস্ত অক্ষর থেকে মুক্তি পাবে যে কোনও সম্ভাব্য শেল প্রসঙ্গে বিশেষ অর্থ রাখতে পারে। ,শেলটির নিজেই এর কোনও বিশেষ অর্থ নেই তবে @ এফ.হৌরি তার উত্তরে উল্লেখ করেছেন যে, এটি {...}ব্রেস প্রসারণের মধ্যে একটি বিশেষ অর্থ রয়েছে : gnu.org/savannah-checksouts/gnu/bash/manual/… এটি এর মতো! যার কেবলমাত্র নির্দিষ্ট পরিস্থিতিতে প্রসারণ প্রয়োজন, সাধারণভাবে নয়: echo Hello World!ঠিক কাজ করে, তবুও echo test!testব্যর্থ হবে।
মক্কি

18

যে অক্ষরগুলি পালানোর দরকার তা বাশনের চেয়ে বোর্ন বা পসিক্স শেলের মধ্যে আলাদা। সাধারণত (খুব) বাশ those শাঁসগুলির একটি সুপারস্টেট, তাই আপনি যে কোনও কিছুতে পালাতে পারেন shellবাশে পালিয়ে যাওয়া উচিত।

একটি দুর্দান্ত সাধারণ নিয়ম হবে "যদি সন্দেহ হয় তবে এড়িয়ে যান"। তবে কিছু চরিত্র থেকে বাঁচা তাদের একটি বিশেষ অর্থ দেয়, যেমন \n। এগুলি man bashনীচে Quotingএবং পৃষ্ঠাগুলিতে তালিকাবদ্ধ রয়েছে echo

এটি বাদে, যে কোনও চরিত্রের অক্ষর নেই যেগুলি অক্ষর নয়, এটি নিরাপদ। আমি একটি একক নির্দিষ্ট তালিকা জানি না।

ম্যান পেজগুলি সেগুলিকে কোথাও কোথাও তালিকাবদ্ধ করে তবে এক জায়গায় নয়। ভাষা শিখুন, এটি নিশ্চিত হওয়ার উপায়।

একটি যে আমাকে ধরেছে !। এটি বাশ (এবং সিএসএস) এ একটি বিশেষ চরিত্র (ইতিহাসের সম্প্রসারণ) তবে কর্ন শেল নয়। এমনকি echo "Hello world!"সমস্যা দেয়। একক-উদ্ধৃতি ব্যবহার যথারীতি, বিশেষ অর্থ সরিয়ে দেয়।


1
আমি বিশেষত পছন্দ করি একটি দুর্দান্ত সাধারণ নিয়ম "সন্দেহ যদি, এড়ানোর জন্য" পরামর্শ হবে। এখনও চেক করে পরীক্ষা করা sedযদি এড়ানো যায় কিনা তা দেখার পক্ষে যথেষ্ট কিনা তা নিয়ে সন্দেহ রয়েছে। আপনার উত্তরের জন্য ধন্যবাদ!
ফেডরকিই 'ক্ষতি বন্ধ করুন'

2
@ ফেডোরকুই: চেক sedকরা জরুরি নয়, আপনি প্রায় যে কোনও কিছু দিয়ে পরীক্ষা করতে পারেন। sedসমস্যা নয়, bashহয়। একক উদ্ধৃতিগুলির মধ্যে কোনও বিশেষ অক্ষর নেই (একক উদ্ধৃতি ব্যতীত), আপনি এমনকি অক্ষরগুলিও এড়াতে পারবেন না। একটি sedকমান্ড সাধারণত সিঙ্গল কোটের ভিতরে থাকা উচিত কারণ আরআর মেটাচার্যাক্টের নিরাপদ থাকার জন্য শেল মেটাচার্যাক্টরের সাথে প্রচুর ওভারল্যাপ থাকে। ব্যতিক্রমটি হ'ল শেল ভেরিয়েবলগুলি এম্বেড করার সময় যা সাবধানতার সাথে করতে হবে।
সিডরেকে

5
সঙ্গে পরীক্ষা করুন echo। আপনি যা রেখেছিলেন তা যদি বের হয়ে যায় তবে এড়াতে হবে না। :)
মার্ক রিড

6

আমি ধরে নিয়েছি আপনি বাশ স্ট্রিংয়ের কথা বলছেন। বিভিন্ন ধরণের স্ট্রিং রয়েছে যার পালানোর জন্য বিভিন্ন ধরণের প্রয়োজনীয়তা রয়েছে। যেমন। একক উদ্ধৃতি স্ট্রিংগুলি ডাবল উদ্ধৃত স্ট্রিং থেকে পৃথক।

সেরা উল্লেখটি হ'ল বাশ ম্যানুয়ালটির উদ্ধৃতি বিভাগ।

এটি ব্যাখ্যা করে যে কোন চরিত্রগুলি পালানোর প্রয়োজন। মনে রাখবেন যে ইতিহাসের সম্প্রসারণের মতো কোন বিকল্পগুলি সক্ষম করা হয়েছে তার উপর নির্ভর করে কিছু অক্ষরকে পালানোর দরকার হতে পারে।


3
সুতরাং এটি নিশ্চিত করে যে পালানো কোনও সহজ সমাধান ছাড়াই এমন জঙ্গল , প্রতিটি কেস পরীক্ষা করতে হবে। ধন্যবাদ!
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

@ ফেডোরকুই যে কোনও ভাষার মতোই অনুসরণ করার নিয়ম রয়েছে। বাশ স্ট্রিং পলায়নের জন্য, ম্যানুয়ালটিতে বর্ণিত নিয়মের সেটটি বেশ ছোট। ব্যবহারের সবচেয়ে সহজ স্ট্রিং হ'ল সিঙ্গল কোটস, যেহেতু কোনও কিছুই এড়ানোর দরকার নেই। তবে, একক উদ্ধৃত স্ট্রিংয়ের মধ্যে একটি একক উদ্ধৃতি অন্তর্ভুক্ত করার কোনও উপায় নেই।
অস্টিন ফিলিপস

@fedorqui। এটা না একটা জঙ্গল। পালানো বেশ দক্ষ is আমার নতুন পোস্ট দেখুন।
জো সো

@fedorqui আপনি একটি একক উদ্ধৃত পংক্তি ভিতরে একটি একক উদ্ধৃতি ব্যবহার করতে পারবেন না কিন্তু আপনি ভালো কিছু সঙ্গে এটি "এস্কেপ" করতে পারেন: 'টেক্সট' " '"' আরও টেক্সট '
সি আর।

4

আমি লক্ষ্য করেছি যে স্বয়ংক্রিয়-সম্পূর্ণ ব্যবহার করার সময় ব্যাশ স্বয়ংক্রিয়ভাবে কিছু অক্ষর থেকে পালিয়ে যায়।

উদাহরণস্বরূপ, আপনার যদি নামের একটি ডিরেক্টরি থাকে তবে dir:Aবাশ এতে স্বয়ংক্রিয়ভাবে পূর্ণ হবেdir\:A

এটি ব্যবহার করে, আমি ASCII টেবিলের অক্ষরগুলি ব্যবহার করে কিছু পরীক্ষা চালিয়েছি এবং নিম্নলিখিত তালিকাগুলি পেয়েছি:

অক্ষরগুলি যে ব্যাশ স্বয়ংক্রিয়ভাবে সম্পূর্ণরূপে পালাতে পারে : (স্থান সহ)

 !"$&'()*,:;<=>?@[\]^`{|}

যে অক্ষরগুলি মারাত্মকভাবে বাঁচতে পারে না :

#%+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~

(আমি বাদ দিয়েছি /কারণ এটি ডিরেক্টরি নামে ব্যবহার করা যায় না)


2
আপনি যদি সত্যিই একটি বিস্তৃত তালিকা পেতে চান তবে আমি পরামর্শ করব যে কোন অক্ষরটি printf %qযুক্তি হিসাবে উত্তীর্ণ হলে তা সংশোধন করে না - আদর্শভাবে পুরো চরিত্রটিতে গিয়ে।
চার্লস ডাফি

এমন উদাহরণ রয়েছে যেখানে এমনকি অ্যাডোস্ট্রোফ স্ট্রিংয়ের পরেও আপনি বিশেষ অক্ষর তৈরি করতে চিঠি এবং সংখ্যাগুলি থেকে পালাতে চাইতে পারেন। উদাহরণস্বরূপ: ট্র '\ n' '\ t' যা নিউলাইন চরিত্রগুলিকে ট্যাব অক্ষরে অনুবাদ করে।
ডিক গের্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.