বাষ গুণ এবং সংযোজন


18
for k in {0..49};
do
a=$(($((2*$k))+1));
echo $a;
done

হাই, তৃতীয় লাইনের জন্য আমার সরলীকৃত ভাব দরকার, সম্ভবত এমন একটি যা কমান্ড প্রতিস্থাপন ব্যবহার করে না।


@ থিফ্রাস্টাস: প্রস্তাবিত এটি ঠিকঠাক কাজ করে তবে আমি যদি (()) এর পরিবর্তে এক্সপ্রেস ব্যবহার করতে চাই তবে কী হবে।
এভিএস

এটি হ'ল bashএবং না C, তাই সমস্ত অপসারণ করুন ;- যদি না আপনি এটি একটি একক লাইনে লিখে থাকেন।
অট--

আরও দেখুন: unix.stackexchange.com/q/40786/117549
জেফ

declare -i a; for k in {0..49}; do a=2*$k+1; echo $a; done
সাইরাস

1
একপাশে: $(( ... ))গাণিতিক সম্প্রসারণ হ'ল কমান্ড প্রতিস্থাপন নয়।
dave_thompson_085

উত্তর:


28

পাটিগণিত সম্প্রসারণ ব্যবহার:

for (( k = 0; k < 50; ++k )); do
  a=$(( 2*k + 1 ))
  echo "$a"
done

প্রাচীনকাজের exprইউটিলিটি ব্যবহার:

for (( k = 0; k < 50; ++k )); do
  a=$( expr 2 '*' "$k" + 1 )
  echo "$a"
done

ব্যবহার করে bc -l( -lকোনও ক্ষেত্রে গণিতের ক্রিয়াকলাপ ব্যবহৃত হয় না বলে বাস্তবে এটি প্রয়োজন হয় না):

for (( k = 0; k < 50; ++k )); do
  a=$( bc -l <<<"2*$k + 1" )
  echo "$a"
done

bc -lএকটি সহ-প্রক্রিয়া হিসাবে ব্যবহার করা (এটি ব্যাকগ্রাউন্ডে গণনা পরিষেবার ধরণের মত কাজ করে):

coproc bc -l

for (( k = 0; k < 50; ++k )); do
  printf "2*%d + 1\n" "$k" >&${COPROC[1]}
  read -u "${COPROC[0]}" a
  echo "$a"
done

kill "$COPROC_PID"

এটি সর্বশেষটি দেখতে (তর্কযুক্ত) ক্লিনার এতে ksh93:

bc -l |&
bc_pid="$!"

for (( k = 0; k < 50; ++k )); do
  print -p "2*$k + 1"
  read -p a
  print "$a"
done

kill "$bc_pid"

¹ এটি আমার জন্য একটি সমস্যার সমাধান করেছে যেখানে আমাকে লুপে প্রচুর পরিমাণে ইনপুট প্রক্রিয়া করতে হবে। প্রক্রিয়াজাতকরণের জন্য কিছু ভাসমান পয়েন্ট গণনা প্রয়োজন, তবে bcলুপে কয়েকবার বিস্তৃত হওয়া অত্যন্ত ধীর হয়ে গেছে। হ্যাঁ, আমি এটি আরও অনেক উপায়ে সমাধান করতে পারতাম, তবে আমি বিরক্ত হয়ে পড়েছিলাম ...



5

আপনি letএকটি গণনা জোর করতে কমান্ডটি ব্যবহার করতে পারেন ।

let a="2*k+1"

নোট করুন যে আমাদের $kএই কাঠামোর প্রয়োজন নেই; একটি সাধারণ কাজ kকরবে।


4
a=2whateverk+1বর্তমান ডিরেক্টরিটিতে কোনও ফাইল ডেকে থাকলে তা ব্যর্থ হয় । সবচেয়ে খারাপ, যদি কোনও ফাইল ডেকে থাকে a=2+b[$(reboot)]k+1, যা rebootকমান্ডটি কল করে । শ্রেষ্ঠ ব্যবহার করা ((...))এখানে ( ((a = 2 * k + 1)): OR) POSIX সিনট্যাক্সa=$((2 * k + 1))
Stéphane Chazelas

আমরা এটাকে উদ্ধৃত করতে পারি; let a="2*k+1"যে সমাধান করতে।
স্টিফেন হ্যারিস

2

আপনার সম্ভবত গাণিতিক সম্প্রসারণের প্রয়োজন এটি হ'ল:

a=$(( 1+2*k ))

আসলে, আপনার একটি ভেরিয়েবল ব্যবহার করার দরকার নেই:

for k in {0..49}; do
    echo "$(( 1 + 2*k ))"
done

অথবা গণনা ভেরিয়েবলটি একটি for ((…))লুপে সরানো যেতে পারে :

for (( k=0;k<50;k++ )); do
    a=$(( 1+2*k ))
    printf '%s\n' "$a"
done

((…)) লুপের জন্য

এবং সেক্ষেত্রে পাটিগণিতের বিস্তৃতি লুপের অভ্যন্তরেও স্থানান্তরিত হতে পারে:

for (( k=0 ; a=1+2*k , k<50 ;  k++)); do
    printf '%s\n' "$a"
done

বা, একটি অ্যারেতে সমস্ত মান পেতে:

for (( k=0 ; a[k]=1+2*k , k<49 ;  k++ )); do :; done
printf '%s\n' "${a[@]}"

কোনও সূত্র নেই

তবে সম্ভবত কোনও গাণিতিক সম্প্রসারণ এড়াতে সবচেয়ে সংক্ষিপ্ততম উপায় হ'ল ভেরিয়েবলকে দুবার বাড়ানো:

for (( k=0,a=1 ; k<50 ;  k++,a++,a++ )); do
    printf '%s\n' "$a"
done

অথবা, এমনকি সহজতর, কেবল সিক ব্যবহার করুন:

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