বাশ শেল স্ক্রিপ্টে, লুপের জন্য একটি লেখা যা স্ট্রিংয়ের মানগুলিতে পুনরাবৃত্তি হয়


24

ব্যাশে, আমি জানি যে একটি forলুপ লেখা সম্ভব যেখানে iনির্দিষ্ট লক পূর্ণসংখ্যার উপর দিয়ে কিছু লুপ নিয়ন্ত্রণের পরিবর্তনশীল পুনরাবৃত্তি হয়। উদাহরণস্বরূপ, আমি একটি বাশ শেল স্ক্রিপ্ট লিখতে পারি যা 1 এবং 10 এর মধ্যে পূর্ণসংখ্যা মুদ্রণ করে:

#!/bin/bash

for i in {1..10}
do
 echo $i
done

যদি আমি স্ট্রিংয়ের একটি তালিকা সরবরাহ করি তবে তার পরিবর্তে একটি স্ট্রিংয়ের একটি লুপ নিয়ন্ত্রণ ভেরিয়েবলের মাধ্যমে পুনরাবৃত্তি করা সম্ভব? উদাহরণস্বরূপ, ধরুন আমার কাছে একটি স্ট্রিং রয়েছে fnameযা কোনও ফাইলের নাম উপস্থাপন করে। আমি প্রতিটি ফাইলের নামের জন্য কমান্ডের একটি সেট কল করতে চাই। উদাহরণস্বরূপ, আমি fnameএই জাতীয় কমান্ড ব্যবহার করার বিষয়বস্তু মুদ্রণ করতে চাই:

#!/bin/bash

for fname in {"a.txt", "b.txt", "c.txt"}
do
 echo $fname
done

অন্য কথায়, প্রথম পুনরাবৃত্তিতে, fnameএর মান হওয়া উচিত fname="a.txt", যখন দ্বিতীয় পুনরাবৃত্তির উপর, fnameএর মান হওয়া উচিত fname="b.txt", ইত্যাদি। দুর্ভাগ্যক্রমে, মনে হচ্ছে উপরের সিনট্যাক্সটি বেশ সঠিক নয়। আমি আউটপুট পেতে চাই:

a.txt

b.txt

c.txt

তবে যখন আমি উপরের কোডটি চেষ্টা করি তখন আমি এই আউটপুটটি পাই:

{A.txt,

b.txt,

c.txt}

আপনি কি দয়া করে আমাকে সঠিক বাক্য গঠন নির্ধারণ করতে সহায়তা করতে পারেন, যাতে আমি পরিবর্তনশীলটির মান / বিষয়বস্তুকে পুনরাবৃত্তি করতে পারি fname? সময় দেয়ার জন্য ধন্যবাদ.


5
অপসারণ করুন {}, কোনও (স্পেস-সীমাবদ্ধ) তালিকায় লুপ করার জন্য আপনার কোনও প্রয়োজন নেই
মাদুর

3
মানে @Mat অপসারণ {} এবং, গুলি। বিকল্পটি হ'ল স্থানগুলি সরিয়ে ফেলা। সুতরাং হয় "a.txt" "b.txt" "c.txt"বা {"a.txt","b.txt","c.txt"}। তবে আমি {a..c}.txtতার পরিবর্তে পছন্দ করি ।
manatwork

উত্তর:


39

সঠিক বাক্য গঠনটি নিম্নরূপ:

#!/bin/bash

for fname in a.txt b.txt c.txt
do
  echo $fname
done

9
এছাড়াও, নামের একটি অ্যারে ধরে রেখে fnames=( a.txt b.txt c.txt )আপনি বাক্য গঠন ব্যবহার করতে পারেন for f in ${fnames[@]}; do echo $f; done

1
এটি কি সত্য for fname in a.txt b.txt c.txtএবং for fname in "a.txt" "b.txt" "c.txt"অভিন্ন ফলাফল দেয়?
অ্যান্ড্রু

অ্যান্ড্রু, হ্যাঁ এটা সত্য। তারা অভিন্ন ফলাফল পাবেন
আলী গাঙ্গজি

1
অবশ্যই মানগুলি for f in "${fnames[@]}"; do echo $f; done(চারপাশে উদ্ধৃতি সহ ${fnames[@]}) ব্যবহার করা উচিত যদি fnamesমানগুলিতে শ্বেতস্পেস থাকতে পারে। এবং আপনার ব্যবহার করা উচিত "$f", বিশেষত যদি আপনি echo(যেমন, catবা cp) এর চেয়ে আরও পরিশীলিত কিছু করছেন doing (এবং যদি আপনি কেবল করছেন echo, তার printfপরিবর্তে আপনার ব্যবহার করা উচিত ))
স্কট

আমি মনে করি @ ব্যবহারকারী 13742 এর উত্তরেও লক্ষ করা উচিত।
ফ্যালেনেরেপার

1

আমার মনে হচ্ছে আপনার ঠিক করা উচিত ...

printf %s.txt\\n a b c

আমি এটি পছন্দ করি যদিও তার আগে ওপি করার আগে ইকো ছাড়া অন্য কিছু করার কিছু মনে ছিল।
বয়স্ক গীক

0

মন্তব্যগুলিতে ব্যবহারকারী 13742 দ্বারা উল্লিখিত হিসাবে , আমরা এ্যারে ব্যবহার করতে পারি bashএবং ksh:

#!/usr/bin/env bash

files_list=( "a.txt" "b.txt" "c and space.txt" )

for i in "${files_list[@]}"
do
    echo "$i"
    # do something else here,maybe
done

এবং তাই হিসাবে কাজ করে:

$ ./iterate_files_array.sh                                                      
a.txt
b.txt
c and space.txt

তবে কিছু শেল যেমন dash( /bin/shউবুন্টুতে) অ্যারে সমর্থন করে না। এই ক্ষেত্রে আমরা এখানে-নথি কাঠামো ব্যবহার করে অবলম্বন করতে পারি:<<

#!/bin/sh

while IFS= read -r line
do
    echo "$line"
done << EOL
one.txt
two.txt
with space.txt
EOL
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.