আমি কি ব্যাশের ব্রেস প্রসারণে একটি পরিবর্তনশীল ব্যবহার করতে পারি?


10

আমি যেটি সম্পাদন করতে চাইছি তার জন্য নীচে কিছু সিউডো কোড দেওয়া হল:

#!/bin/bash

# I already have the variable below figured out (positive integer):
numlines=$([returns number of lines containing specific characters in a file])

# This is basically what I want to do with it:
for i in {1..$numlines}; do
    # the part below is already figured out as well:        
    do some other stuff
done

আমি কমান্ড লাইন থেকে number {1..n} 'অনুক্রমের আসল নম্বর inোকিয়ে সূক্ষ্মভাবে সম্পাদন করতে পারি। এখানে কেবল একটি ভেরিয়েবল অন্তর্ভুক্ত করা সম্ভব এবং এটি কীভাবে করা যায় তা আমার কেবল জানতে হবে।

  • আমি exportএটি চেষ্টা করার চেষ্টা করেছি
  • আমি ভেরিয়েবলটি নিজেই অনুক্রমের ভিতরে কোঁকড়া ধনুর্বন্ধনীতে রাখার চেষ্টা করেছি: {1..${numlines}}
  • এটি আরও প্রসারিত হবে আশা করে ডাবল-কোটে রাখার চেষ্টা করেছি: {1.."$numlines"}
  • আমি পালানোর চেষ্টা করেছি $:{1..\$numlines}

set -[something]এই ভেরিয়েবলটি প্রসারিত করার জন্য আমাকে কি একটি আদেশ ব্যবহার করতে হবে? এমনকি আমি ব্যবহারের কিছু ফর্ম চেষ্টা করেছি eval... সবই কোনও লাভ হয়নি।

আমার কেবলমাত্র জানতে হবে যে আমি অনুপস্থিত কোন সাধারণ বা অস্পষ্ট কিছু আছে কিনা বা আমার আরও সময় নষ্ট করার আগে এটি যদি সম্ভব হয় তবেও।

এটি প্রয়োজন মতো কাজ করার জন্য এটি করার এক সত্যই, সত্যই হ্যাকিশ উপায়কে আমি একসাথে ছুঁড়ে ফেলতে পারি , তবে আমি এটিকে এড়াতে চাই এবং যদি সম্ভব হয় তবে তা করার উপায়টি সঠিকভাবে শিখতে চাই।


উত্তর:


11

দুর্ভাগ্যক্রমে, সেই সম্প্রসারণে (এএফএআইকি) কোনও পরিবর্তনশীল ব্যবহার করার কোনও উপায় নেই, যেহেতু ব্রেস প্রসারণের পরে পরিবর্তনশীল প্রসার ঘটে।

ভাগ্যক্রমে, একটি সরঞ্জাম রয়েছে যা একই কাজ করে।

for i in $(seq 1 $numlines); do
    # stuff
done

seqজিএনইউ কোর্টিল থেকে প্রাপ্ত; এটি পসিক্সে কীভাবে করবেন সে সম্পর্কে কোনও ধারণা নেই।


1
(প্লাস 1) seqজিএনইউ সিস্টেমগুলির জন্য ভাল এবং যদি আমি সঠিকভাবে স্মরণ করি তবে অতি সাম্প্রতিক ওএসএক্স। অন্যান্য বিএসডি সিস্টেমে, পরিবর্তে জট ব্যবহার করতে পারেন ।
1024

seqপুরোপুরি কাজ করে। আপনার প্রম্পট উত্তরের জন্য আপনাকে অনেক ধন্যবাদ।
রুবিনোরেল

এটি আমার প্রশ্নের অংশ ছিল না - তবে বিপরীত ক্রমে এটি করার জন্য সিনট্যাক্সটি (যদি থাকে) {16..1}কী? $(seq $numlines 1)এটা কাজ করছে না. আমি অনুমান করি যে আমি সবসময়ই পারি man seqতবে কেবল অবাক হয়ে ভাবছি যে কেউ তাদের মাথার উপরের অংশটি জানত কিনা।
রুবিনোরেল

1
এই লিঙ্কটি থেকে বিপরীতে কীভাবে এটি করবেন তা for i in $(seq $numlines -1 1)
সবেমাত্র আবিষ্কার করলেন

seq ${numlines} -1 0
ডোপঘোটি

10

অবশ্যই। আপনি যদি এমন একটি লুপের জন্য চান যা একটি পূর্ণসংখ্যার ভেরিয়েবলকে বাড়িয়ে দেয় তবে forলুপের রূপটি ব্যবহার করুন যা একটি পূর্ণসংখ্যার ভেরিয়েবলকে বাড়িয়ে তোলে (বা আরও সাধারণভাবে লুপ ভেরিয়েবল (গুলি) এর গাণিতিক সম্পাদন করে)।

for ((i=1; i<=numlines; i++)); do  done

এই কনস্ট্রাক্টটি ব্যাশে কাজ করে (এবং ksh93 এবং zsh), তবে প্লেন sh এ নয়। প্লেইন sh এ, কিছুক্ষণ লুপ এবং পরীক্ষা ( [ … ]) কনস্ট্রাক্ট ব্যবহার করুন।

i=1
while [ "$i" -le "$numlines" ]; do
  
  i=$((i+1))
done

8

যদি আপনার অবশ্যই এড়াতে হবে seq, যা টম হান্ট হিসাবে দেখায় evalযে এটির সাধারণ সমাধান বলে মনে হচ্ছে, তবে একটি অবশ্যই এটি করতে পারে (যদিও, আমি এটি উত্সাহিত করব না):

eval 'for i in {1..'$numlines'}; do echo $i; done'

আপনি}} সম্প্রসারণ এড়িয়ে পজিক থাকতে পারেন এবং কেবল গণিত এবং পূর্ণসংখ্যার তুলনা করুন $numlines:

while [ ! "$numlines" -eq 0 ]; do
     echo "$numlines"
     : $((numlines-=1))
done

POSIX বাইরে, bashএবং kshএবং zshএছাড়াও সি-শৈলী আছে forলুপ:

for((i=0; i<numlines; i++)); do echo $i; done

1
আমি সত্যিই এই উত্তর প্রশংসা করি। seqআমার দৃশ্যের জন্য সূক্ষ্মভাবে কাজ করার সময় এবং এটি সহজ সমাধান বলে মনে হয়েছিল, তবে এটি জেনে রাখা ভাল যে অন্যান্য বিকল্প (এমনকি পসিক্স) রয়েছে। এর জন্য ধন্যবাদ.
রুবিনোরেল

2
সত্যিই ব্যবহার করার কোনও কারণ নেই eval; যদি আপনার ব্রেস প্রসারিত হয় তবে আপনার সি-স্টাইলের লুপ রয়েছে।
চিপনার

@ স্পস্কিক - আমি যদি 2 টি উত্তর চয়ন করতে পারি তবে আমি এটির একটিও বেছে নেব। যখন আমি সত্যটি দেখতে পেলাম যে আমার বিপরীতে এটি করা দরকার ছিল, তখন আপনার evalউদাহরণটি সবচেয়ে সহজ ছিল এবং এটি ব্যবহারের বিকল্প উপায় অনুসন্ধান করতে আমাকে বাঁচিয়ে দিত seqwhileলুপ আমার জন্য একটু ভারী হয়। আমি জিনিসগুলি ছোট এবং মিষ্টি রাখতে পছন্দ করি এবং আমি 0 বা 1 এর মান দিয়ে সি-স্টাইলের forলুপটি কখনই কাজ করতে পারি না i। এটি কখনই সঠিকভাবে ফিরে আসে নি এবং সর্বদা কিছুটা বন্ধ ছিল। আমি নিশ্চিত যে এটি সঠিকভাবে কাজ করার জন্য টুইট করা যেতে পারে, তবে এটি অবশ্যই কার্যকর সমাধান।
রুবিনোরেল

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