আইএফএস এর সুযোগ কি


0

আমি আইএফএসের সুযোগ দ্বারা বিভ্রান্ত, বিভিন্ন মানুষ মনে করে যে এটি সেট / পরিবর্তিত হওয়ার পরে কেবল স্ক্রিপ্টের মধ্যে এটি ভিত্তিক সেশন ভিত্তিক।

আমার সমস্যা হল, আমার কিছুক্ষণ পড়তে হয়েছে যার সম্ভাব্য ফাঁকা কলাম রয়েছে, যা ভেরিয়েবলগুলিকে অফসেট করে আমি সেটিকে সেট করছি। যদি আমি ট্যাব থেকে ডেটাতে ডিলিমিটার পরিবর্তন করি এবং সেই নতুন ডিলিমিটারটি ব্যবহার করতে আইএফএস আপডেট করি তবে আমার উদ্বিগ্ন যে এটি আমার কাজের প্রবাহের মধ্যে অন্য পাঠ্য কমান্ডগুলিকে প্রভাবিত করতে পারে।

আমি যদি কিছু ভালো করি:

while IFS='|' read var1 var2 var3

যে নির্দিষ্ট সময় লুপ জন্য শুধুমাত্র আইএফএস মান পরিবর্তন হবে?

উত্তর:


2

যে নির্দিষ্ট সময় লুপ জন্য শুধুমাত্র আইএফএস মান পরিবর্তন হবে?

না, আসলে এটি শুধুমাত্র জন্য এটি পরিবর্তন করা হবে read অংশ। মধ্যে while লুপ এর শরীর, এবং তারপরে, এটি তার ডিফল্টে ফিরে যাবে, কারণ এটি শুধুমাত্র প্রসঙ্গের মধ্যে সেট করা হবে read কমান্ড।

আপনি এটি প্রমাণ করে এমন কিছু ফাইলের উপর একটি সরল লুপ লিখতে পারেন, উদাঃ। দুটি কলাম সহ একটি CSV ফাইল সহ:

#!/bin/bash
while IFS="," read a b; do
  echo $a $b
done < "input.csv"
echo $IFS

আউটপুট শেষ লাইন খালি প্রদর্শিত হবে, ডিফল্ট হিসাবে, আইএফএস হয় <space>, <tab> এবং <newline>, এইভাবে $' \t\n'। দেখ বিস্তারিত জানার জন্য POSIX স্পেক

যদি আপনার কাছে (দুর্ঘটনাক্রমে?) আপনার সমগ্র স্ক্রিপ্টের জন্য অন্য কোনও আইফোনে সেট করা থাকে, unset IFS এটি ডিফল্ট পুনরায় সেট করে।

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


@ ড্যানিয়েল লিস্টন এটি অনির্বাচিত এবং ডিফল্ট হিসাবে সেট করার মধ্যে একটি অর্থোপযোগী পার্থক্য রয়েছে, তবে বাশ এটির সাথে একই আচরণ করে: "আইএফএস অনির্বাচিত থাকলে, অথবা এটির মানটি ঠিক আছে & lt; ট্যাব & gt; & lt; newline & gt ;, ডিফল্ট, তারপর ... "এবং" যদি আইএফএসের মান নাল হয় তবে কোন শব্দ বিভক্ত হয় না। "- দেখুন man bash
slhck

সংশোধনের জন্য আপনাকে ধন্যবাদ। ম্যান পৃষ্ঠাগুলি "ইনপুট" ক্ষেত্র বিভাজক পরিবর্তে "অভ্যন্তরীণ" হিসাবে আইফেসে "আমি" উল্লেখ করার সময় সতর্কতা গ্রহণ করা উচিত। "ডিফল্ট" এর উপর ভিত্তি করে আমাকে প্রথম স্থানে শেল সেটিং আইএফএসের বিন্দু বা পুনরুদ্ধারের প্রশ্ন করতে হবে। :(
Daniel Liston

1
while IFS='|' read var1 var2 var3

যে নির্দিষ্ট সময় লুপ জন্য শুধুমাত্র আইএফএস মান পরিবর্তন হবে?

না। এটি শুধুমাত্র নির্দিষ্ট আইএফএসের মান পরিবর্তন করবে read সাধারণত লুপ থেকে হয় while থেকে done, এটা অনেক কমান্ড অন্তর্ভুক্ত হতে পারে।

তন্ন তন্ন IFS না read এখানে বিশেষ। এই সাধারণ কোডটি নিন

( export a=0
printenv a
while a=1 printenv a && printenv a; printenv a; true; do
   printenv a
   break
done; printenv a )

ফলাফল হলো:

0
1
0
0
0
0

শুধু দ্বিতীয় printenv পরিবর্তিত মান পায়!

নোট:

  • আমি দুটি কারণে একটি subshell ব্যবহার:
    1. শেল চালানোর আগে আপনি পুরো কোডটি পেস্ট করতে পারেন;
    2. কোড প্রভাবিত করবে না a আপনার বর্তমান শেল পরিবর্তনশীল।
  • আমি ব্যবহার করতাম printenv a, না echo $a কারণ পরবর্তী ক্ষেত্রে শেল প্রসারিত হবে $a দ্বারা দেখা মান শেল নিজেই এমনকি আগে echo শুরু (নির্বিশেষে কিনা echo একটি শেল নির্মিত বা একটি পৃথক এক্সিকিউটেবল হয়)। সিনট্যাক্স variable=foo some_command খুব কমই শেল নিজেই জন্য পরিবর্তনশীল পরিবর্তন (ব্যতিক্রম variable=foo export variable )। আপনি প্রতি পরিবর্তিত হলে printenv a থেকে echo $a আমার কোড, আপনি সব পাবেন 0 -s।

-1

হ্যাঁ, আপনার কোড ব্লক অনুসারে, আইএফএস মান শুধুমাত্র লুপের জন্য সেট করা হচ্ছে। কন্ট্রোল লুপ থেকে বের হয়ে গেলে, লুপ প্রবেশ করার আগে আইএফএস তার মান অর্জন করে। এটি একই শেল স্ক্রিপ্টে অন্য পঠিত ক্রিয়াকলাপকে প্রভাবিত করবে না। আমি এই মত কিছু চেষ্টা:

echo "Changing IFS value to ','."
OLD_IFS_VALUE=$IFS
IFS='|'
CURRENT_IFS_VALUE=$IFS
echo "IFS value before entering the loop : $CURRENT_IFS_VALUE"
while IFS=',' read name age city gender
do
    echo $name $age $city $gender
done < "testdata1.csv"
echo "After loop value of IFS : $IFS"

তাই আমি আইএফএস সেট করেছিলাম '|' লুপ আগে। লুপ ভিতরে, আমি ',' হিসাবে আইএফএস মান ব্যবহার করে। কন্ট্রোল লুপ থেকে বের হয়ে গেলে, আইএফএস মান ছিল '|'।


-1 কারণ কঠোর উত্তর "না"। "নিয়ন্ত্রণ একবার লুপ আউট গিয়েছিলাম" বরং উচিত "একবার নিয়ন্ত্রণ পাস read "জায়গা আছে লুপ ভিতরে কোথায় IFS এটি না ,। আমার উত্তর দেখুন।
Kamil Maciorowski
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.