স্ট্রিংগুলির তালিকার মাধ্যমে বাশ লুপ


14

এই নমুনা ফর্ম্যাট করা সম্ভব:

for i in string1 string2 stringN
do
 echo $i
done

এর অনুরূপ কিছুতে:

for i in 
string1
string2
stringN
do
 echo $i
done

সম্পাদনা: বিভ্রান্তির জন্য দুঃখিত, বুঝতে পারেনি যে স্ক্রিপ্ট কার্যকর করার বিভিন্ন পদ্ধতি ছিল - sh <scriptname>বনাম bash <scriptname>এবং এই জিনিসটিও আমি এখনই নাম রাখতে পারি না - #!/bin/shএবং #!/bin/bash:)


আপনি যে সমস্যাটি সমাধান করার চেষ্টা করছেন তা কী?
jesse_b

আপনি কাজ করে কিনা তা জানতে আপনি যা জিজ্ঞাসা করছেন তা চেষ্টা করে দেখেছেন?
ডোপঘোতি

@ জেসি_বি পঠনযোগ্যতা এবং গুচ্ছের গুচ্ছের পরিচালনাযোগ্যতা

@ দোপগোতি হ্যাঁ আমি করেছি

@ ওয়াইয়ে: সেক্ষেত্রে একটি অ্যারে হ'ল আপনার সেরা বাজি। গ্লেন জ্যাকম্যানের উত্তর দেখুন।
jesse_b

উত্তর:


34

ব্যাশে অ্যারে ব্যবহার করা পঠনযোগ্যতায় সহায়তা করতে পারে: এই অ্যারে সিনট্যাক্স শব্দের মধ্যে স্বেচ্ছাসেবী স্থানের অনুমতি দেয়।

strings=(
    string1
    string2
    "string with spaces"
    stringN
)
for i in "${strings[@]}"; do
    echo "$i"
done

1
এটি সবচেয়ে মার্জিত বলে মনে হচ্ছে, তবে দুর্ভাগ্যক্রমে ত্রুটি দেয়: সিনট্যাক্স ত্রুটি: "(" অপ্রত্যাশিত

1
@ ওয়াইয়ি, তাহলে আপনি এটি বাশে চালাচ্ছেন না। মনে রাখবেন যে shএটি অগত্যা বাশ নয় এবং বিশেষত দেবিয়ান এবং উবুন্টুতে নয়।
ইলক্কাচু

1
@ ইল্কাচ্চু ভাবুন আমি এখনই এটি পেয়েছি - অবশ্যই "বাশ <scriptname>" চালাতে হবে না "sh <scriptname>" :)

@ ওয়ায়েই, বা একটি যথাযথ হ্যাশবাং / শেবাং লাইন রাখুন এবং এটিকে কার্যকর করার মতো চালান। প্রয়োজনীয় পড়া: শিবাং কি শেলটি নির্ধারণ করে যা স্ক্রিপ্টটি চালায়?
ইলক্কাচু

1
: @rrrrr, আপনার প্রশ্ন সম্ভবত এখানে উত্তর দেওয়া হয় stackoverflow.com/q/12314451/7552
গ্লেন জ্যাকম্যান


2

আপনি যে আইটেমটি লুপ করবেন তার আগে / পরে আপনি নিউলাইনগুলি এড়াতে পারবেন:

for i in \
    string1 \
    string2 \
    stringN
do
   printf '%s\n' "$i"
done

অথবা, এই সাধারণ উদাহরণের জন্য:

printf '%s\n' string1 string2 stringN

যার একই ফল রয়েছে।

সম্পর্কিত:

একটি bashঅ্যারে ব্যবহার করে বিভিন্নতা :

strings=(
    string1
    string2
    stringN
)

printf '%s\n' "${strings[@]}"


1
list='a b c d'
for element in $list;do 
    echo "$element"
done

আপনি সেমিকোলন অনুপস্থিত!
41754

মনে রাখবেন যে প্রতিটি স্ট্রিং পৃথক শব্দ হিসাবে এটি কাজ করবে। আপনার স্ট্রিংগুলিতে শূন্যস্থান হওয়ার সাথে সাথে স্পেসগুলি স্ট্রিংটিকে একাধিক শব্দে বিভক্ত করে দেবে। এছাড়াও, যদি $listস্ট্রিংটিতে ফাইলের নাম গ্লোব্বিং অক্ষর থাকে ( list='* * * *') থাকে তবে শেলটি সম্ভবত ফাইলের নামের সাথে মিলে যায়।
কুসালানন্দ

0

আপনি এখানেloop কমান্ডটি এখানে উপলভ্য ব্যবহার করতে পারেন :

$ loop "echo $ITEM" --for string1,string2,string3

বা, আপনার যদি ফাইল হিসাবে একটি তালিকা থাকে:

$ cat file_list.txt | loop "echo $ITEM"

0

একই জিনিস, কম পাঠ্য:

array=(
        string{1..7}
)

for i in "${array[@]}"; do
    echo "$i"
done

string1ইত্যাদি আক্ষরিক মানগুলি প্রদর্শিত হয় না, তারা স্থানধারক, সুতরাং এই পদ্ধতির কাজ হয় না।
স্টিফেন কিট

যদি তাই হয়, কেন বিরক্ত করছেন array ( … )? শুধু কর for i in string{1..7}; do echo "$i"; done; এমনকিprintf '%s\n' string{1..7}
αғsнιη
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.