কেন প্রিন্টফ প্রত্যাশার চেয়ে বেশি আর্গুমেন্ট মুদ্রণ করে?


9

এই শেল স্ক্রিপ্ট প্রিন্টিং ইনপুটগুলি কেন দু'বার?

আমি প্রত্যাশা করেছি স্ক্রিপ্টটি 5 এর পরে ইনপুটগুলিকে উপেক্ষা করবে।

লিপি:

#! /bin/bash
echo "Enter 5 words : "
read  a b c d e 
printf "> %s %s %s %s %s <" $a $b $c $d $e

আউটপুট:

user@linux:~$ pico ifs2.sh
user@linux:~$ ./ifs2.sh
Enter 5 words : 
1 2 3 4 5 
> 1 2 3 4 5 <user@linux:~$ ./ifs2.sh
Enter 5 words : 
1 2 3 4 5 6
> 1 2 3 4 5 <> 6     <user@linux:~$ ./ifs2.sh
Enter 5 words : 
1 2 3 4 5 6 7 8 9 0
> 1 2 3 4 5 <> 6 7 8 9 0 <user@linux:~$ 

এবং, script আইএফএসে সেট করা যাই হোক না কেন নিম্নলিখিত স্ক্রিপ্টটি কাজ করে। কেন?

#! /bin/bash    
old="$IFS"
IFS=":"
echo "IFS = $IFS"
echo "Enter 5 words : "
read  a b c d e 
printf "> %s %s %s %s %s <" $a $b $c $d $e    
IFS="$old"

আউটপুট:

user@linux:~$ ./ifs2.sh
IFS = :
Enter 5 words : 
1 2 3 4 5  
> 1 2 3 4 5      <user@linux:~$ ./ifs2.sh
IFS = :
Enter 5 words : 
1 2 3 4 5
> 1 2 3 4 5     <user@linux:~$ ./ifs2.sh
IFS = :
Enter 5 words : 
1:2:3:4:5
> 1 2 3 4 5 <user@linux:~$ 

printfকোনও ফর্ম্যাট স্পেসিফায়ারের \cসাথে যুক্ত এর সাথে যে কোনও সময় থামুন %b। লাইক:printf %s%\ d%b thing 3 "${var+\cquit printing if set}\nelse do a newline" and 0 keep\ going.
মাইকেসার্ভ

উত্তর:


18

আপনার তিনটি সমস্যা রয়েছে:

  1. এর সাথে read, যদি ইনপুটটিতে ক্ষেত্রের তুলনায় কম ভেরিয়েবলের নাম থাকে তবে সর্বশেষ বর্ণটি ডিলিমিটারগুলির সাথে রেখার বাকী সমস্ত ক্ষেত্রের সাথে আবদ্ধ হবে। তার মানে তাদের $eপায় 5 6আপনার প্রথম অপ্রত্যাশিত উদাহরণ।
  2. যেহেতু সমস্ত $a.. $eঅব্যক্ত, তাদের মানগুলি ক্ষেত্র বিভক্ত হয়ে যায় । তাহলে $eঝুলিতে " 5 6" তাহলে তা বিস্তৃতি দুই কমান্ড আর্গুমেন্ট।
  3. printfতার সমস্ত আর্গুমেন্ট %গ্রহন করে, প্রতিস্থাপনের সাথে সাথে একইসাথে বহু যুক্তি ব্যবহার করে , বারবার। এটি ডকুমেন্টেশনে এইভাবে দাফন করা হয়েছে :

    formatপ্রতীক যুক্তি operands সন্তুষ্ট হিসাবে প্রায়ই প্রয়োজনীয় হিসাবে পুনঃব্যবহৃত করা হবে। কোনও অতিরিক্ত cবা sরূপান্তর নির্দিষ্টকরণকারীকে মূল্যায়ন করা হবে যেমন নাল স্ট্রিং যুক্তি সরবরাহ করা হয়েছিল; অন্যান্য অতিরিক্ত রূপান্তর স্পেসিফিকেশন মূল্যায়ন করা হবে যেমন একটি শূন্য আর্গুমেন্ট সরবরাহ করা হয়েছে।

    অন্য কথায়, যদি অব্যবহৃত আর্গুমেন্টগুলি থাকে তবে এটি আবার শুরু হয় এবং পুরো ফর্ম্যাট স্ট্রিং সহ এগুলি শুরু থেকেই প্রসেস করে। এটি কার্যকর যখন আপনি একটি সম্পূর্ণ অ্যারে ফর্ম্যাট করতে চান, বলুন:

    printf '%b ' "${array[@]}"

    আপনার printfকমান্ড প্রতিটি $a.. থেকে একটি যুক্তি পেয়েছে $d, এবং তারপরেও অনেকগুলি বাকি রয়েছে $e$e" 5 6" কখন , printfদুটি ঘুরে বেড়ায়, দ্বিতীয়টি কেবল 6ফর্ম্যাট করতে চলেছে । এটি যখন 5 6 7 8 9 10দ্বিতীয় মুদ্রণের জন্য বিকল্পগুলির সম্পূর্ণ পরিসীমা থাকে।


আপনি অতিরিক্ত ডামি ফিল্ড যুক্ত করে readএবং আপনার পরামিতি বিকল্পগুলি (যা সর্বদা একটি ভাল ধারণা) উদ্ধৃত করে এগুলি এড়াতে পারেন :

read  a b c d e dummy
printf "> %s %s %s %s %s <" "$a" "$b" "$c" "$d" "$e"

এটি দেবে:

Enter 5 words : 
1 2 3 4 5 6 7 8 9 10
> 1 2 3 4 5 <

dummyসমস্ত অতিরিক্ত ক্ষেত্র printfপায় এবং কেবলমাত্র আপনি প্রত্যাশিত পাঁচটি আর্গুমেন্ট পান।


আপনার দ্বিতীয় সম্পাদিত ইন-এর প্রশ্নের একইরকম উত্তর রয়েছে: কেবল স্থান নেই aযখন একটি মান পায় IFS। এর অর্থ $b.. $eকিছুতেই প্রসারিত হবেনা, সুতরাং printfকেবল একটি যুক্তি পান। বিন্যাসের স্ট্রিং থেকে আপনার স্পেসগুলি মুদ্রিত হয়, এর মধ্যে কিছুই পরিবর্তিত হয় না ("যেন কোনও নাল স্ট্রিং যুক্তি সরবরাহ করা হয়েছিল")।


আমি আবার "$ a" ..... "$ ই" ব্যবহার করে ২ য় স্ক্রিপ্ট পরীক্ষা করেছি। দ্বিতীয় স্ক্রিপ্ট আবার একই সমস্যা দিচ্ছে।

3
উদ্ধৃতিটি দ্বিতীয় স্ক্রিপ্টে কোনও পার্থক্য আনছে না। একক স্ট্রিংয়ের aমান রয়েছে 1 2 3 4 5এবং এটি একবারে প্রতিস্থাপিত হয়ে যায়।
মাইকেল হোমার

6
 printf "> %s < " 1 2 3

মুদ্রণ করবে

 > 1 <> 2 <> 3 <

  printf "> %s %s <" 1 2 3

কপি করে প্রিন্ট

 > 1 2 <> 3  <

printf এর বিন্যাসের স্ট্রিংটি সন্তুষ্ট করতে সমস্ত আর্গুমেন্ট খায় এবং তারপরে সমস্ত তর্কগুলি প্রক্রিয়া না করা পর্যন্ত পুনরাবৃত্তি করে।

দ্বিতীয় স্ক্রিপ্টগুলি কাজ করে কারণ কেবল কখনওই $aবরাদ্দ করা হয় এবং সুতরাং কমান্ডটি অতিরিক্ত পুনরাবৃত্তিতে প্রবাহিত হয় না (কেবলমাত্র একটি পুনরাবৃত্তি রয়েছে)।


এই আচরণটি সরবরাহ করা পাঠ্যে নথিভুক্ত করা হয় help printf:

... সমস্ত আর্গুমেন্ট গ্রাস করতে প্রয়োজন হিসাবে ফর্ম্যাটটি পুনরায় ব্যবহার করা হয়। যদি ফর্ম্যাটের প্রয়োজনের তুলনায় কম যুক্তি থাকে তবে অতিরিক্ত বিন্যাসের স্পেসিফিকেশনগুলি এমনভাবে আচরণ করে যেন একটি শূন্য মান বা নাল স্ট্রিং যথাযথভাবে সরবরাহ করা হয়েছিল। ...

এবং http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html দ্বারা আদেশ দেওয়া হয়েছে


কেন এই আচরণ? এটি কি নথিভুক্ত?
শিপলু মোকাদ্দিম

1
@ শিপলু আচরণের ডকুমেন্টেড এবং আচরণের প্রয়োজনীয় মানদণ্ড সম্পর্কে একটি অনুচ্ছেদ যুক্ত করেছেন।
PSkocik
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.