শেল স্ক্রিপ্টে একটি স্ট্রিং মূল্যায়ন


8

আমি এই বাশ শেল স্ক্রিপ্টিং গাইড অনুসরণ করছি:

সংখ্যার তুলনা বিভাগে এটি একটি উদাহরণ তুলে ধরেছে:

anny > num=`wc -l work.txt`

anny > echo $num
201

anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi

উপরে যা ঘটছে বলে মনে হচ্ছে তা হল আমরা একটি ব্যাশ ভেরিয়েবলের কমান্ডের একটি স্ট্রিং সংরক্ষণ করি এবং তারপরে আমরা ভেরিয়েবলের প্রতিধ্বনি প্রার্থনা করি। যা ঘটবে বলে মনে হচ্ছে তা হল স্ট্রিংটি মূল্যায়ন করা হয় এবং ডাব্লুসি কমান্ড কার্যকর করা হয় এবং লাইন গণনাটি নিয়ন্ত্রণকারী টার্মিনালে ফেরত দেয়।

ঠিক আছে, তাই আমি আমার টার্মিনালটি উবুন্টু 12.04 এ চালু করব এবং অনুরূপ কিছু চেষ্টা করব:

$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt

এক সেকেন্ড অপেক্ষা করুন, যা স্ট্রিংকে মূল্যায়ন করে না এবং লাইন গণনাটি ফেরত দেয়। এটি কেবল টার্মিনালের কাছে স্ট্রিং প্রতিধ্বনি করেছিল। কেন আমি আলাদা ফলাফল পেয়েছি?


লক্ষ্য করুন NUM স্ট্রিং নির্ধারিত হয় না wc -l work.txt, এর পরিবর্তে এটি সংখ্যা 201. নিয়োগ হচ্ছে
অগ্নি

উত্তর:


2

এক্সপ্রেশনটি মূল্যায়নের জন্য আপনাকে ব্যাকটিক্স ব্যবহার করতে হবে।

$ num=`wc -l sample.txt`
$ echo $num
1 sample.txt

আপনি যদি আউটপুটে কেবল "1" দেখতে চান তবে কমান্ডটি ব্যবহার করুন

$ num=`cat sample.txt | wc -l`
$ echo $num
1

এবং এছাড়াও কাজ করে:

$ num=`wc -l < sample.txt`
$ echo $num
1

অতিরিক্ত তথ্যের জন্য, কমান্ডলাইনে ডাবলকোটস "", সিঙ্গলকোটস '' এবং ব্যাকটিক্স ´ between এর মধ্যে পার্থক্য দেখুন ?


কোনও ধারণা কেন আমি '1 নমুনা। টেক্সট 'পাই এবং কেবল' 1 'নম্বরটি পাই না?
জনমারলিনো

wcকমান্ড কিভাবে কাজ করে তা এইভাবে । ব্যবহার করে দেখুন cat sample.txt | wc -l
দানতেলা

ডাব্লুসি-এল এটির নামের সাথে একটি ফাইলের মধ্যে উপস্থিত রেখার সংখ্যা প্রদর্শন করে।
অবিনাশ রাজ

5

দয়া করে এই চিহ্নটি নোট করুন:

'

একক উদ্ধৃতি

   Enclosing characters in single quotes preserves the  literal  value  of
   each character within the quotes.  A single quote may not occur between
   single quotes, even when preceded by a backslash.

এবং

`

Backquote

   Command substitution allows the output of a command to replace the com
   mand name.  There are two forms:

          $(command)
   or
          `command`

   Bash performs the expansion by executing command and replacing the com
   mand  substitution  with  the  standard output of the command, with any
   trailing newlines deleted.

সুতরাং ব্যাককোটটি কমান্ডের ফলাফল স্ট্যান্ডার্ড আউটপুটে ফিরিয়ে দিচ্ছে। এই কারণে

`wc -l sample.txt`

কমান্ডের ফলাফল প্রদান করে, যখন

'ডাব্লুসি-এল নমুনা। টেক্সট'

কেবল "ডাব্লুসি-এল নমুনা। টেক্সট" যথারীতি স্ট্রিং হিসাবে ফিরিয়ে দিন

উদাহরণ হিসাবে এটি করা বিবেচনা করুন:

$ A='wc -l /proc/mounts'
$ B=`wc -l /proc/mounts`
$ C=$(wc -l /proc/mounts)

এবং এখন তিনটি ভেরিয়েবল প্রতিধ্বনি:

$ echo $A
wc -l /proc/mounts
$ echo $B
35 /proc/mounts
$ echo $C
35 /proc/mounts

4

যদি আপনি কোনও ভেরিয়েবলের কমান্ডের আউটপুট ক্যাপচার করতে চান তবে আপনাকে হয় ব্যাকটিক্স ব্যবহার করতে হবে ``বা কমান্ডটি এটিকে বন্ধ করে রাখতে হবে $():

$ d=$(date)
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
$ d=`date`
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014

নোট করুন যে স্ট্রিংটি ভেরিয়েবল ঘোষণার মুহূর্তে মূল্যায়ন করা হয়, আপনি যখন এটি প্রতিধ্বনিত করেন তখন তা নয়। কমান্ডটি আসলে $()বা ব্যাকটিক্সের মধ্যে চালিত হয় এবং সেই কমান্ডের আউটপুটটি ভেরিয়েবলের মান হিসাবে সংরক্ষণ করা হয়।

সাধারণভাবে, আপনার সর্বদা $()ব্যাকটিকগুলির পরিবর্তে ব্যবহার করা উচিত যা অবনতিযুক্ত এবং কেবলমাত্র উপযুক্ততার কারণে এবং আরও অনেক সীমাবদ্ধ। আপনি উদাহরণস্বরূপ, ব্যাকটিক্সের মধ্যে নেস্ট কমান্ডগুলি করতে পারবেন না তবে আপনি এটি সহ করতে পারেন $():

$ echo $(date -d $(echo yesterday))
Sun Mar 16 10:26:07 CET 2014

দেখুন এই থ্রেড কেন কিছু আরো বিস্তারিত জানার জন্য ইউ & এল উপর ``এড়িয়ে চলা উচিত।


1
আমি সম্মত স্ক্রিপ্টগুলি পছন্দ $( )করা উচিত ` `। কিন্তু ফক্কড় বলছেন , backquotes না নীড়। echo $(date -d $(echo yesterday))হয়ে যায় echo `date -d \`echo yesterday\``; echo $(echo $(date -d $(echo yesterday)))হয়ে echo `echo \`date -d \\\`echo yesterday\\\`\``। আমি বলছি এটি আপনার থিসিসটিকে পুনরায় প্রত্যাখ্যান করে না বরং এটি আরও জোরদার করার জন্য : পালিয়ে যাওয়া অভ্যন্তরীণ ব্যাককোটগুলি ` `প্রায়শই স্বীকৃত চেয়ে সিনট্যাক্সকে আরও শক্তিশালী করে তোলে তবে এর বিশেষ চিকিত্সাটি \অদ্ভুত, অবাক করা এবং যুক্তিযুক্ত hard আপনি $( )যা দেখেন তার সাথে সাধারণত আপনি যা পান তা হয়।
এলিয়াহ কাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.