স্ক্রিপ্টে কীভাবে গাণিতিক ভেরিয়েবল যুক্ত করবেন


26

আমি একটি ফোল্ডারে থাকা অনেকগুলি ফাইলের লাইন আকারটি জমা করতে চাই। আমি নিম্নলিখিত স্ক্রিপ্ট লিখেছি:

let a=0
let num=0
for i in folder/*
do
        num=`cat $i | wc -l`
        a=$a+$num
done
echo $a

স্ক্রিপ্টের শেষে আমি যা পাচ্ছি তা হ'ল 123 + 234 + 432 + ... এবং সংখ্যার গাণিতিক ক্রিয়াকলাপের ফলাফল নয়।

উত্তর:


50

আপনার গাণিতিক মূল্যায়ন সিনট্যাক্সটি ভুল। নিম্নলিখিতগুলির যে কোনওটি ব্যবহার করুন (প্রথমটি অত্যন্ত পোর্টেবল তবে ধীর, দ্বিতীয়টি পসিক্স এবং পোর্টেবল ব্যার্ন শেল এবং অ্যালকুইস্ট শেলের পূর্ববর্তী সংস্করণ ব্যতীত, শেষ তিনটি প্রয়োজন ksh, bashবা zsh):

a=`expr "$a" + "$num"`

a=$(($a+$num))

((a=a+num))

let a=a+num

((a+=num))

অথবা আপনি কেবল পুরো forলুপটি এড়িয়ে যেতে পারেন:

wc -l folder/*

বা, আপনি যদি কেবল মোটটি চান:

cat folder/* | wc -l

বা zsh এবং তার mult_iosবিকল্প সহ:

wc -l < folder/*

$ভেতরের দরকার নেই ((...))a=$((a+num))ইতিমধ্যে ভাল আছে।
ওয়েইজুন চিউ

যদি কোনও ভেরিয়েবল সেট না করা হয় বা নাল মান থাকে তবে এটি হ্যান্ডল করার কোনও উপায় না থাকলে এই কাজ করবে।
ভারত

7

আপনি এই কোডটি ব্যবহার করতে পারেন

    a=`expr $a + $num`
    echo $a

এবং নিশ্চিত করুন যে এখানে "$ a + $ নাম্বার" উভয় পক্ষের মধ্যে একটি স্পেস রয়েছে


গণনার জন্য expr কমান্ড ব্যবহার করার সময় সর্বদা অপারেটরের উভয় পক্ষেই স্থান দিন।
ব্যবহারকারী1678213

2

আপনি প্রথমে ভেরিয়েবলের ধরণটি ঘোষণা করতে পারেন:

    declare -i a=0
    declare -i num=0

1

দুঃখিত, পূর্ববর্তী সম্পাদনাটি একটি ভিন্ন পোস্টের জন্য ছিল। এখানে, মূল স্ক্রিপ্টে কেবলমাত্র একটি ছোট্ট পরিবর্তন:

একটি = 0 দিন
চলুন নাম = 0
আমার জন্য ফোল্ডারে / *
করা
        num = `cat $ i | wc -l`
        a = $ (প্রতিধ্বনি + এ + $ সংখ্যা | বিসি)
সম্পন্ন
প্রতিধ্বনি $ ক

1
উত্তরে ভোট দেওয়া হয়েছে, কারণ উত্তরটি প্রশ্নের সমাধান করতে দেখা যাচ্ছে না।
4

দুঃখিত বন্ধুরা, এখন সংশোধন করেছেন
লিও

1

উত্তরে কোন শেলটিতে কোডটি বৈধ তা নির্দিষ্ট করতে হবে। উদাহরণস্বরূপ বোর্ন শেল ( sh) -এ কেবলমাত্র নিম্নলিখিত নির্দেশাবলী বৈধ:

a=$((a+num))
a=$(($a+$num))

@manatwork দ্বারা তালিকাভুক্ত অন্যান্য সম্ভাবনাগুলি আবার বোর্নে শেল ( bash) এ বৈধ হতে পারে


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