আইএফএস = $ '\ n' এর সঠিক অর্থ কী?


124

নিম্নলিখিত উদাহরণটি, যা IFSপরিবেশকে একটি লাইন ফিড চরিত্রের জন্য পরিবর্তনশীল সেট করে ...

IFS=$'\n'
  • কী ডলার চিহ্ন মানে ঠিক ?
  • এই নির্দিষ্ট ক্ষেত্রে এটি কী করে?
  • এই নির্দিষ্ট ব্যবহারের বিষয়ে আমি আরও কোথায় পড়তে পারি (গুগল অনুসন্ধানগুলিতে বিশেষ অক্ষরের অনুমতি দেয় না এবং অন্যথায় কী সন্ধান করতে হবে তা আমি জানি না)?

আমি জানি IFSপরিবেশের পরিবর্তনশীল কী, এবং \nচরিত্রটি কী (লাইন ফিড) তবে কেবল নীচের রূপটি কেন ব্যবহার IFS="\n"করবেন না : (যা কাজ করে না)?

উদাহরণস্বরূপ, আমি যদি কোনও ফাইলের প্রতিটি লাইনটি লুপ করতে চাই এবং লুপের জন্য একটি ব্যবহার করতে চাই, আমি এটি করতে পারি:

for line in (< /path/to/file); do
    echo "Line: $line"
done

যাইহোক, IFSলাইন ফিড অক্ষরকে সেট না করা হলে এটি সঠিকভাবে কাজ করবে না । এটি কাজ করতে, আমাকে এটি করতে হবে:

OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
    echo "Line: $line"
done
IFS=$OLDIFS

দ্রষ্টব্য: একই জিনিসটি করার জন্য আমার আর কোনও উপায়ের দরকার নেই, আমি ইতিমধ্যে আরও অনেককে জানি ... আমি কেবল এটি সম্পর্কে আগ্রহী এবং আমি ভাবছি যে $'\n'কেউ যদি আমাকে এ সম্পর্কে কোনও ব্যাখ্যা দিতে পারে তবে।

উত্তর:


161

সাধারণত bashস্ট্রিং ল্যাটারলে এস্কেপ সিকোয়েন্সগুলি ব্যাখ্যা করে না। সুতরাং আপনি যদি লিখেন \nবা "\n"বা '\n', এটি লাইন ব্রেক না - এটি চিঠিটি n(প্রথম ক্ষেত্রে) বা চিঠিটির পরে একটি ব্যাকস্ল্যাশ হয় n(অন্য দুটি ক্ষেত্রে)।

$'somestring'এস্কেপ সিকোয়েন্স সহ স্ট্রিং লিটারেলের একটি বাক্য গঠন । সুতরাং বিপরীতে '\n', $'\n'আসলে একটি লাইন ব্রেক।


2
ঠিক তেমনটি নয় - \nis just an (পালানো) অক্ষর n। আপনি ঠিক বলেছেন '\n'এবং "\n"এন দ্বারা অনুসরণ করা হয়।
রোমান চ্যাপলিয়াকা

15
নোট যে $'\n'বাশ নির্দিষ্ট - এটি একটি পসিক্স শেল ( /bin/sh) এ কাজ করবে না । পসিএক্স-অনুবর্তী পদ্ধতিতে একই প্রভাব পেতে, আপনি টাইপ করতে পারেন IFS=', তারপরে একটি রিয়েল হিট করুন একটি নতুন নতুন চরিত্র টাইপ করুন, তারপরে বন্ধটি টাইপ করুন'
রিচার্ড হ্যানসেন

23
IFS=$(echo -e '\n')এটি পসিক্স-সামঞ্জস্যপূর্ণ উপায়ে করা উচিত।
ভিনিতে

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

9
@ ডিজিটালট্রামা আমার মনে হয় এটি পসিক্সও-e নয়: সংজ্ঞায়িত নয়, এবং এক্সএসআই এক্সটেনশন হিসাবে কাজ \nনা -eকরে: pubs.opengroup.org/onlinepubs/9699919799/utilities/…printf '\n'শিলা;)
সিরো সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

20

শুধু কনস্ট্রাক্ট তার দিতে সরকারী নাম : ফর্মের স্ট্রিং $'...'বলা হয় ANSI সি-উদ্ধৃতিচিহ্ন সহ পংক্তি

এটি, [এএনএসআই] সি স্ট্রিংয়ের মতো, ব্যাকল্যাশ পালানোর ক্রমগুলি তাদের আক্ষরিক সমতুল্যতে স্বীকৃত এবং প্রসারিত হয়েছে (সমর্থিত পালানোর ক্রমগুলির সম্পূর্ণ তালিকার জন্য নীচে দেখুন)।

পরে এই সম্প্রসারণ, $'...'হিসাবে একই এইরকম আচরণ স্ট্রিং '...'স্ট্রিং - অর্থাত, তারা হিসাবে গণ্য করছেন লিটারেল নয় এমন যেকোনো [আরও] শেল প্রসারণও সাপেক্ষে

উদাহরণস্বরূপ, $'\n'একটি আক্ষরিক নিউলাইন অক্ষরে প্রসারিত - যা নিয়মিত বাশ স্ট্রিং আক্ষরিক (হোক '...'বা "..."না) কিছু করতে পারে না। [1]

আর একটি আকর্ষণীয় বৈশিষ্ট্য হ'ল এএনএসআই সি-উদ্ধৃত স্ট্রিংগুলি '(একক উদ্ধৃতি) যেমন পালাতে পারে\' , '...'(নিয়মিত একক-উদ্ধৃত স্ট্রিংগুলি):

echo $'Honey, I\'m home' # OK; this cannot be done with '...'

সমর্থিত পালানোর ক্রমগুলির তালিকা :

ব্যাকস্ল্যাশ এস্কেপ সিকোয়েন্সগুলি যদি উপস্থিত থাকে তবে নিম্নলিখিতভাবে ডিকোড করা হয়েছে:

alert একটি সতর্কতা (ঘণ্টা)

\ বি ব্যাকস্পেস

\ e \ E একটি পালানোর চরিত্র (এএনএসআই সি নয়)

form চ ফর্ম ফিড

। n নতুন লাইন

car r গাড়ি ফেরত

horiz t অনুভূমিক ট্যাব

। v উল্লম্ব ট্যাব

ks ব্যাকস্ল্যাশ

single 'একক উদ্ধৃতি

\ "ডাবল উদ্ধৃতি

আটটি-বিট অক্ষরের n nnn যার মান অষ্টাল মান nnn (এক থেকে তিন অঙ্ক)

\ xHH আট-বিট অক্ষর যার মান হেক্সাডেসিমাল মান এইচএইচ (এক বা দুটি হেক্স অঙ্ক)

\ ইউনিকোড (আইএসও / আইইসি 10646) অক্ষর যার মান হেক্সাডেসিমাল মান এইচএইচএইচএইচ (এক থেকে চার হেক্স অঙ্ক)

\ ইউনিকএডএইচএইচএইচএইচএইচএইচএইচ ইউনিকোড (আইএসও / আইইসি 10646) অক্ষর যার মান হেক্সাডেসিমাল মান এইচএইচএইচএইচএইচএইচএইচএইচ (এক থেকে আটটি হেক্স অঙ্ক)

x cx একটি নিয়ন্ত্রণ-এক্স অক্ষর

প্রসারিত ফলাফলটি একক-উদ্ধৃত, যেন ডলারের সাইন উপস্থিত ছিল না।


[1] তবে, আপনি '...' এবং "..." স্ট্রিংগুলিতে প্রকৃত নিউলাইনগুলি এম্বেড করতে পারেন ; অর্থাত্, আপনি একাধিক লাইনের বিস্তৃত স্ট্রিংগুলি সংজ্ঞায়িত করতে পারেন।


16

Http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html থেকে :

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

আমি অনুমান করি যে এটি স্ক্রিপ্টটি বাধ্যতামূলকভাবে যথাযথ এএনএসআই-সি স্ট্যান্ডার্ডে লাইন ফিডটি এড়াতে বাধ্য করছে।


8

ডিফল্ট আইএফএস পুনরুদ্ধার- এটি OLDIFS=$IFSপ্রয়োজন হয় না। ডিফল্ট আইএফএস ওভাররাইডিং এড়ানোর জন্য সাবএলে নতুন আইএফএস চালান:

ar=(123 321); ( IFS=$'\n'; echo ${ar[*]} )

এছাড়াও আমি সত্যই বিশ্বাস করি না আপনি পুরানো আইএফএস পুরোপুরি পুনরুদ্ধার করেছেন। লাইন ব্রেকিং যেমন এড়াতে আপনার এটির দ্বিগুণ উদ্ধৃতি দেওয়া উচিত OLDIFS="$IFS"


2
এটি সত্যিই দরকারী কৌশল is আমি শুধু একটি ক্লিনার শেল ব্যবহার করতে যোগদানের অপ: args=$(IFS='&'; echo "$*")। পুনরূদ্ধার IFSকরতে $' \t\n'একটি বোর্ন শেল বন্ধুত্বপূর্ণ পদ্ধতিতে কোন গড় কৃতিত্ব নেই।
jeberle

পুনরায় Besides I don't really believe you recover the old IFS fully: শব্দ বিভাজন পরিবর্তনশীল অ্যাসাইনমেন্টের আরএইচএসে সঞ্চালিত হয় না (তবে উদ্ধৃতি অপসারণ), সুতরাং OLDIFS=$IFSএবং OLDIFS="$IFS"একইভাবে আচরণ করুন।
mklement0

3

এএনএসআই সি-উদ্ধৃত স্ট্রিংগুলি একটি মূল বিষয়। ধন্যবাদ @ এমকেলেমেন্ট ০।

আপনি কমান্ড ওড দিয়ে এএনএসআই সি-উদ্ধৃত স্ট্রিং পরীক্ষা করতে পারেন।

echo -n $'\n' | od -c
echo -n '\n' | od -c
echo -n $"\n" | od -c
echo -n "\n" | od -c

আউটপুট:

0000000  \n  
0000001

0000000   \   n   
0000002

0000000   \   n   
0000002

0000000   \   n   
0000002

আউটপুটগুলি দ্বারা আপনি পরিষ্কারভাবে অর্থটি জানতে পারবেন।


-7

এটি একটি পরিবর্তনশীল থেকে মান পুনরুদ্ধার করার মতো:

VAR='test'
echo VAR
echo $VAR

ভিন্ন, তাই ডলারের সাইনটি মূলত সামগ্রীর মূল্যায়ন করে।


6
ভেরিয়েবলের সাথে এর কোনও যোগসূত্র নেই। $'FOO'( $FOOযার বিপরীতে এটি প্রশ্ন ছিল না) এটি একটি স্ট্রিং আক্ষরিক। আপনি চালানো হলে echo $'VAR', এটির স্ট্রিং ছাপে দেখতে পাবেন VARনা test
sepp2k
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.