বাশে দুটি ভেরিয়েবল বিয়োগ করুন


220

দুটি ডিরেক্টরিতে ফাইলের সংখ্যা বিয়োগ করতে আমার নীচের স্ক্রিপ্ট রয়েছে তবে COUNT=অভিব্যক্তিটি কার্যকর হয় না। সঠিক বাক্য গঠন কী?

#!/usr/bin/env bash

FIRSTV=`ls -1 | wc -l`
cd ..
SECONDV=`ls -1 | wc -l`
COUNT=expr $FIRSTV-$SECONDV  ## -> gives 'command not found' error
echo $COUNT

উত্তর:


224

আপনাকে বিয়োগ চিহ্ন এবং ব্যাকটিক্সের চারপাশে কিছুটা অতিরিক্ত সাদা জায়গা প্রয়োজন:

COUNT=`expr $FIRSTV - $SECONDV`

প্রস্থান স্থিতি সম্পর্কে সচেতন হন:

এক্সপ্রেসন শূন্য বা 0 হলে এক্সপ্রেসনটি শূন্য বা 0, 1 না হলে প্রস্থান স্থিতি 0 হয়

সেট-এর সাথে মিশ্রিত করে ব্যাশ স্ক্রিপ্টে এক্সপ্রেশনটি ব্যবহার করার সময় এটি মনে রাখবেন যা কমান্ডটি শূন্য-স্থিতি স্থিতি ছাড়লে অবিলম্বে প্রস্থান করবে।


2
এই উত্তরটি পক্সিক্স শেলটিতেও কাজ করে sh। বহনযোগ্যতার জন্য, আপনি এই উত্তরটি ব্যবহার করতে চাইতে পারেন।
ডিন্কেল্ক

এটি লক্ষণীয় যে শেলচেকের মতে, এক্সপ্রেস একটি কোডমিল কারণ এটি প্রাচীন এবং ব্যবহার করা কঠিন: github.com/koalaman/shellcheck/wiki/SC2003
জন

368

বাহ্যিক প্রোগ্রামটি ব্যবহার করার চেষ্টা করার পরিবর্তে এই বাশ বাক্য গঠনটি ব্যবহার করে দেখুন expr:

count=$((FIRSTV-SECONDV))

বিটিডাব্লু, ব্যবহারের সঠিক বাক্য গঠনটি exprহ'ল:

count=$(expr $FIRSTV - $SECONDV)

তবে মনে রাখবেন exprব্যবহারটি আমি উপরে প্রদত্ত অভ্যন্তরীণ বাশ সিনট্যাক্সের চেয়ে ধীর হতে চলেছে।


4
এই ফর্মটি এক্সপ্রেটার বহিরাগত প্রোগ্রামটি ব্যবহার করার চেয়ে দ্রুতগতির।
এনএসজি

এটি ব্যাকটিক্স ছাড়াই কাজ করে তবে আমি জানতে পারি কেন? উত্তর +১ এর জন্য +1
অমল মুরালি

2
ধন্যবাদ। ব্যাকটিক পুরানো শেল সিনট্যাক্স। BASH $(command)কমান্ড প্রতিস্থাপনের জন্য নতুন সিনট্যাক্স সমর্থন করে । এছাড়াও যেহেতু BASH এতে গাণিতিক অপারেশনগুলিকে সমর্থন করে $(( ... ))বাহ্যিক ইউটিলিটি ব্যবহার না করাই ভালexpr
অনুভাভা

1
খুব আকর্ষণীয় "$" ব্যতীত আপনার পরিবর্তনশীলগুলি উল্লেখ করতে আমি কখনই নতুন হতে পারি না। এটি উবুন্টু 12,14 মাত্র এফআইআইতে কাজ করে।
ম্যাডহ্যাটার

1
@ অ্যালিকেলজিন-কিলাকা: বাশ-এ $(( ... ))পাটিগণিতের এক্সপ্রেশন মূল্যায়নের জন্য ব্যবহৃত হয়।
অনুভা

30

তুমি ব্যবহার করতে পার:

((count = FIRSTV - SECONDV))

নিম্নলিখিত ট্রান্সক্রিপ্ট অনুযায়ী একটি পৃথক প্রক্রিয়া শুরু করা এড়ানোর জন্য:

pax:~$ FIRSTV=7
pax:~$ SECONDV=2
pax:~$ ((count = FIRSTV - SECONDV))
pax:~$ echo $count
5

12

সাদা স্থান গুরুত্বপূর্ণ, exprএর অপারেশন এবং অপারেটরদের পৃথক যুক্তি হিসাবে প্রত্যাশা করে। আপনাকে আউটপুটও ক্যাপচার করতে হবে। এটার মত:

COUNT=$(expr $FIRSTV - $SECONDV)

তবে অন্তর্নির্মিত গাণিতিক সম্প্রসারণটি ব্যবহার করা আরও সাধারণ:

COUNT=$((FIRSTV - SECONDV))

12

আমি বশে সবসময় এইভাবে গণিত করি:

count=$(echo "$FIRSTV - $SECONDV"|bc)
echo $count

5
কেবলমাত্র প্রয়োজনীয় যদি আপনি ভাসমান পয়েন্ট সংখ্যাগুলি নিয়ে কাজ করে থাকেন।
গ্লেন জ্যাকম্যান

2
আমি বুঝতে পারি, তবে আমি |bcএকবার বা দু'বার মিস করার চেয়ে টাইপ কমান্ড দিয়ে সেই মামলাগুলি ধরার অভ্যাস করব make তারা যেমনটি বলে বিভিন্ন লোকের জন্য আলাদা স্ট্রোক।
পিওরফেরেট

5

সাধারণ পূর্ণসংখ্যার জন্য, আপনি বিল্টিন লেট কমান্ডটিও ব্যবহার করতে পারেন ।

 ONE=1
 TWO=2
 let "THREE = $ONE + $TWO"
 echo $THREE
    3

আরও তথ্যের জন্য let, এখানে দেখুন ।


@ অন্য.এনন.কোয়ার্ড আপনার লিঙ্কটি আমার +1 এর চেয়ে ভাল। (... এবং চুরির লিঙ্ক)
শন চিন

এই কাজটি করতে বেশ ঝামেলা হয়েছিল। শেষ পর্যন্ত এটি কাজ করেছে - let "sanity_check_duration=sanity_check_duration_end_time_delay_sec - sanity_check_duration_start_time_delay_sec"(ভেরিয়েবল থেকে ডলার সাইন অপসারণ)
সন্দীপন নাথ

2

বিকল্পভাবে প্রস্তাবিত 3 টি পদ্ধতিতে আপনি চেষ্টা করতে পারেন letযা ভেরিয়েবলগুলিতে গাণিতিক ক্রিয়াকলাপগুলি নিম্নলিখিতভাবে চালিত করে:

let COUNT=$FIRSTV-$SECONDV

অথবা

let COUNT=FIRSTV-SECONDV


0

পাইথন ব্যবহার করুন:

#!/bin/bash
# home/victoria/test.sh

START=$(date +"%s")                                     ## seconds since Epoch
for i in $(seq 1 10)
do
  sleep 1.5
  END=$(date +"%s")                                     ## integer
  TIME=$((END - START))                                 ## integer
  AVG_TIME=$(python -c "print(float($TIME/$i))")        ## int to float
  printf 'i: %i | elapsed time: %0.1f sec | avg. time: %0.3f\n' $i $TIME $AVG_TIME
  ((i++))                                               ## increment $i
done

আউটপুট

$ ./test.sh 
i: 1 | elapsed time: 1.0 sec | avg. time: 1.000
i: 2 | elapsed time: 3.0 sec | avg. time: 1.500
i: 3 | elapsed time: 5.0 sec | avg. time: 1.667
i: 4 | elapsed time: 6.0 sec | avg. time: 1.500
i: 5 | elapsed time: 8.0 sec | avg. time: 1.600
i: 6 | elapsed time: 9.0 sec | avg. time: 1.500
i: 7 | elapsed time: 11.0 sec | avg. time: 1.571
i: 8 | elapsed time: 12.0 sec | avg. time: 1.500
i: 9 | elapsed time: 14.0 sec | avg. time: 1.556
i: 10 | elapsed time: 15.0 sec | avg. time: 1.500
$
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.