আমি কীভাবে ডাবল উদ্ধৃতিগুলির মধ্যে একটি ডাবল উদ্ধৃতি থেকে বাঁচতে পারি?


286

আমি কীভাবে বাশে ডাবল স্ট্রিংয়ের ভিতরে ডাবল উদ্ধৃতিগুলি রক্ষা করব?

উদাহরণস্বরূপ, আমার শেল স্ক্রিপ্টে

#!/bin/bash

dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES"

ENCLOSED BY '\"'ডাবল উদ্ধৃতি সহ আমি সঠিকভাবে পালাতে পারি না। আমি আমার ভেরিয়েবলের জন্য একক উদ্ধৃতি ব্যবহার করতে পারি না, কারণ আমি পরিবর্তনশীলটি ব্যবহার করতে চাই $dbtable




2
@kenorb না যে প্রশ্ন সদৃশ মত চেহারা ...
মার্ক


@ ডেইনথ এটি যে কমান্ডের প্রবণতা নয় তা আপনি শেষ ব্যবহারকারীদের কোনও অ্যাক্সেসের আশা করতে পারেন। বাল্ক লোড স্ক্রিপ্টগুলি সাধারণত বিশ্বস্ত ব্যবহারকারীরা (যেমন সিস্টেম প্রশাসক বা বিকাশকারী) দ্বারা সার্ভারে চালিত হয় । হ্যাঁ, যদি শেষ ব্যবহারকারীরা এর মান নিয়ন্ত্রণ করেন তবে $dbtableএকটি ঝুঁকি রয়েছে। এটি খুব অস্বাভাবিক হবে, যদিও শেষ ব্যবহারকারীরা সাধারণত তাদের ডেটা লোড করার জন্য কোনও মেশিনে এসএসএইচ করে না।
jpmc26

উত্তর:


285

একটি ব্যাকস্ল্যাশ ব্যবহার করুন:

echo "\""     # Prints one " character.

9
কাজ করছে না. x=ls; if [ -f "$(which "\""$x"\"")" ]; then echo exists; else echo broken; fi;যেহেতু ভাঙ্গা দেয় ... [ -f "$(which $x)" ]; ...বা ... [ -f $(which "$x") ]; ...কাজ ঠিক সূক্ষ্ম। সমস্যাগুলি উত্থাপিত হবে যখন হয় $xবা ফলাফলের $(which "$x")সাথে কোনও স্থান বা অন্য বিশেষ চরিত্রের সাথে কিছু দেয়। একটি কর্মক্ষেত্রের ফলাফলটি ধরে রাখতে একটি পরিবর্তনশীল ব্যবহার করা হচ্ছে which, তবে বশ কি কোনও উদ্ধৃতি থেকে পালাতে সত্যিই অক্ষম বা আমি কিছু ভুল করছি?
লু

আমি নিম্নলিখিতটি grep -oh "\"\""$counter"\""\w*" ব্যাশ সিনট্যাক্সের অংশ হিসাবে ব্যবহার করার চেষ্টা করছি যেখানে ইন $counterভেরিয়েবল। এটি কোনও চিন্তা পছন্দ করে না
জে ডি

82

খোলের উদ্ধৃতিগুলি পালনের একটি সহজ উদাহরণ:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

এটি ইতিমধ্যে খোলা একটি ( ') শেষ করে, পালিয়ে যাওয়া একটিকে ( \') রেখে অন্য একটি ( ') খোলার মাধ্যমে সম্পন্ন হয় ।

বিকল্পভাবে:

$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc

এটি ইতিমধ্যে একটি ( ') খোলার সমাপ্ত করে , অন্য একটি উদ্ধৃতি ( "'") এ একটি উদ্ধৃতি রেখে এবং তার পরে অন্যটি ( ') খোলার মাধ্যমে সম্পন্ন হয়েছে ।

আরও উদাহরণ: একক-উদ্ধৃত স্ট্রিংয়ের মধ্যে একক-উদ্ধৃতি থেকে বেরিয়ে আসা


1
আমি sh -c "প্রতিধ্বনি" key "কী": "মান"} "" এবং এমনকি sh -c "প্রতিধ্বনি '{'" "" 'কী' '"" ":' '' '' মান ''" "চেষ্টা করেছি '}' "শব্দটি কী এবং মানটিকে দ্বিগুণ উদ্ধৃতিতে সংযুক্ত করার প্রয়াসে, তবে উভয় ক্ষেত্রেই আমি পেয়েছি {কী: মান}
ইগোর ইয়াগলনিটর

1
এটি ডাবল উদ্ধৃতিগুলির জন্য অযথা জটিল বলে মনে হচ্ছে: পিটারের উত্তরের মতো echo "abc\"abc"উত্পাদন করতে যথেষ্ট abc"abc
ডাইভনেক্স

2
এই সাধারণ উদাহরণে প্রকৃতপক্ষে, তবে নেস্টেড কোটসের জটিল ক্ষেত্রে, এটি করা প্রয়োজন হতে পারে এবং @ কেনারব এর উদাহরণ আমাকে কীভাবে এই মামলাগুলি মোকাবেলা করতে পারে তা নির্ধারণ করতে সহায়তা করেছিল।
prosoitos

63

আমি জানি না কেন এই পুরাতন বিষয়টি বাশ ট্যাগযুক্ত তালিকায় আজ পপ আপ হয়েছে, তবে ভবিষ্যতের গবেষকদের ক্ষেত্রে কেবল মনে রাখতে হবে যে আপনি যে অক্ষরের প্রতিধ্বনি করতে হবে তার ASCII কোড ব্যবহার করে আপনি পালিয়ে যাওয়া এড়াতে পারবেন।

উদাহরণ:

 echo -e "This is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22"
 This is "'"'"text"'"'"

\x22ডাবল কোট এবং \x27একক উদ্ধৃতিগুলির জন্য ASCII কোড (হেক্সে) । একইভাবে আপনি যে কোনও চরিত্র প্রতিধ্বনি করতে পারেন।

আমি মনে করি আমরা যদি উপরের স্ট্রিংটিকে ব্যাকস্ল্যাশগুলির সাথে প্রতিধ্বনিত করার চেষ্টা করি, আমাদের একটি অগোছালো দুটি সারি ব্যাকস্ল্যাশড ইকো লাগবে ... :)

ভেরিয়েবল অ্যাসাইনমেন্টের জন্য এটি সমতুল্য:

 $ a=$'This is \x22text\x22'
 $ echo "$a"
 This is "text"

যদি ভেরিয়েবলটি ইতিমধ্যে অন্য কোনও প্রোগ্রাম দ্বারা সেট করা থাকে তবে আপনি সেড বা অনুরূপ সরঞ্জামগুলির সাথে ডাবল / একক উদ্ধৃতি প্রয়োগ করতে পারেন।

উদাহরণ:

 $ b="Just another text here"
 $ echo "$b"
 Just another text here
 $ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator
 Just another "0" here #this is not what i wanted to be
 $ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b"
 Just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way.

1
+1 কারণ এটি PS1 ভেরিয়েবলটি / / প্রোফাইলে যোগ করার সমস্যার সমাধান করেছে echo 'export PS1='\[\033[00;31m\]${?##0}$([ $? -ne 0 ] && echo \x22 \x22)\[\033[00;32m\]\u\[\033[00m\]@\[\033[00;36m\]\h\[\033[00m\][\[\033[01;33m\]\d \t\[\033[00m\]] \[\033[01;34m\]\w\n\[\033[00m\]$( [ ${EUID} -ne 0 ] && echo \x22$\x22 || echo \x22#\x22 ) '' >> ~/.profile
ইয়াসাইন এলবাডাউই

1
এই উত্তর! আমি আপনাকে স্যার ভালবাসি।
মিগুয়েল রোজাস কর্টেস

28

বাশ আপনাকে সংলগ্ন স্ট্রিংগুলি রাখার অনুমতি দেয় এবং এগুলি কেবল একসাথে আঠালো হয়ে যাবে।

আমার স্নাতকের:

$ echo "Hello"', world!'

উত্পাদন করে

Hello, world!

কৌশলটি প্রয়োজন অনুসারে একক এবং ডাবল-উদ্ধৃত স্ট্রিংগুলির মধ্যে বিকল্প হতে পারে। দুর্ভাগ্যক্রমে, এটি দ্রুত খুব অগোছালো হয়ে যায়। উদাহরণ স্বরূপ:

$ echo "I like to use" '"double quotes"' "sometimes"

উত্পাদন করে

I like to use "double quotes" sometimes

আপনার উদাহরণে, আমি এটি এরকম কিছু করব:

$ dbtable=example
$ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES'
$ echo $dbload

যা নিম্নলিখিত আউটপুট উত্পাদন করে:

load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES

এখানে কী চলছে তা দেখা মুশকিল, তবে আমি ইউনিকোড উদ্ধৃতি ব্যবহার করে এটিকে বর্জন করতে পারি। নিম্নলিখিতগুলি ব্যাশে কাজ করবে না - এটি কেবল উদাহরণের জন্য:

dbload=' load data local infile "' ' 'gfpoint.csv'' ' " into' ' table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '' ' "' ' ' LINES' ' TERMINATED BY "' ' '\n'' ' " IGNORE 1 LINES' ' '

উপরের "" "" এর মতো উদ্ধৃতিগুলি ব্যাশ দ্বারা ব্যাখ্যা করা হবে। ভালো লেগেছে " 'ফলাফলগুলি পরিবর্তনশীল শেষ হবে।

আমি যদি আগের উদাহরণটিতে একই চিকিত্সা দিই তবে এটির মতো দেখাচ্ছে:

$ echo" I like to use" ' "double quotes"' " sometimes"


4
ওফ ... এটি কিছু কুরুচিপূর্ণ জিনিস।
ম্যাজিক অক্টোপাস উরান 23'19

17

পরীক্ষা করে দেখুন printf, ...

#!/bin/bash
mystr="say \"hi\""

প্রিন্টফ ব্যবহার না করেই

echo -e $mystr

আউটপুট: "হাই" বলুন

ব্যবহার printf,

echo -e $(printf '%q' $mystr)

আউটপুট: বলুন hi "হাই \"


2
নোট করুন যে printfআরও চরিত্রগুলি যেমন পালিয়ে যায় ', (এবং)
ডেভিড পারসন

printf %qএর জন্য evalফর্ম্যাট না করে স্ট্রিং প্রস্তুত করে echo -e
চার্লস ডাফি

2
সেখানে মোড়ানো কোনো কারণ নেই printfএকটি সঙ্গে এর বেহুদা ব্যবহারecho । আপনার দুটি উদাহরণই উদ্ধৃতি ভঙ্গ করেছে। সঠিক ফিক্সটি হল ভেরিয়েবলের ডাবল-কোট করা।
ট্রিপলি

15

ডাবল উদ্ধৃতি চরিত্রটি ভেরিয়েবল হিসাবে সংরক্ষণ করুন:

dqt = ' "'
প্রতিধ্বনি "একটি ডাবল উদ্ধৃত স্ট্রিংয়ের ভিতরে ডাবল উদ্ধৃতি $ {dqt} X $ {dqt" "

আউটপুট:

ডাবল উদ্ধৃত স্ট্রিংয়ের ভিতরে "এক্স" ডাবল

39
বাশ সত্যই সবচেয়ে খারাপ ভাষা
অ্যান্ডি রে

@ 12 ব্লক, আপনার উত্তরটি নির্বোধ: ডি! বিশেষত যখন "সেড" কমান্ডটি ব্যবহার করে এটি আমার দিনটি বাঁচায়!
আর্টানিস জেরাতুল

11

String "স্ট্রিং" ব্যবহার করুন।

এই উদাহরণে, এটি হবে,

dbload = load "লোড ডেটা লোকাল ইনফাইলে '"' gfPoint.csv 'table "টেবিলের মধ্যে $ dbtable FIELDS TERMINATED BY', 'ENLOSED BY' \" "লাইনগুলি টারমিনেটেড \" '\ n' I "IGNORE 1 লাইন"

দ্রষ্টব্য ( ম্যান পৃষ্ঠা থেকে ):

ডলারের চিহ্ন (string "স্ট্রিং") এর আগে একটি ডাবল-কোটেড স্ট্রিংয়ের ফলে বর্তমান লোকেল অনুসারে স্ট্রিংটি অনুবাদ করা হবে। যদি বর্তমান লোকেল সি বা পসিক্স হয় তবে ডলারের চিহ্নটি উপেক্ষা করা হবে। যদি স্ট্রিংটি অনুবাদ এবং প্রতিস্থাপন করা হয় তবে প্রতিস্থাপনটি ডাবল-কোটেড হয়।


3
ভাল লাগল, ওটা জানতো না।
ডেভিড কিরানস

-5

"\"এটির পরিবর্তে ডাবল উদ্ধৃতিটি আগে যোগ করুন\

#! /bin/csh -f

set dbtable = balabala

set dbload = "load data local infile "\""'gfpoint.csv'"\"" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"\""' LINES TERMINATED BY "\""'\n'"\"" IGNORE 1 LINES"

echo $dbload
# load data local infile "'gfpoint.csv'" into table balabala FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "''" IGNORE 1 LINES

6
ডাউনভোট: আপনি কেন cshএকটি bashপ্রশ্নের উত্তর পোস্ট করছেন ? দুটি সম্পূর্ণ স্বতন্ত্র এবং বেমানান।
ট্রিপলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.