বাশ স্ক্রিপ্টে শর্তসাপেক্ষে "বা" "যদি" বিবৃতিতে ব্যবহার করুন


127

এই প্রশ্নটি আমার আগের প্রশ্নের ধরণের সিক্যুয়েল । এই সাইটের ব্যবহারকারীরা দয়া করে আমাকে বাশ forলুপটি কীভাবে লিখতে হবে তা স্ট্রিংয়ের মানগুলিতে পুনরাবৃত্তি করতে সহায়তা করে। উদাহরণস্বরূপ, ধরুন যে একটি লুপ নিয়ন্ত্রণ ভেরিয়েবল fnameস্ট্রিংগুলির উপরে পুনরাবৃত্তি করে "a.txt" "b.txt" "c.txt"। আমি echo"হ্যাঁ!" করতে চাই কখন fnameমান "a.txt"বা "c.txt", এবং echo"না!" অন্যথায়। আমি নিম্নলিখিত বাশ শেল স্ক্রিপ্ট চেষ্টা করেছি:

#!/bin/bash

for fname in "a.txt" "b.txt" "c.txt"
do
 echo $fname
 if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
 echo "yes!"
else
 echo "no!"
fi
done

আমি আউটপুট প্রাপ্ত:

a.txt

না!

b.txt

না!

c.txt

হ্যাঁ!

কেন মূল্য আছে ifযখন বিবৃতি দৃশ্যত সত্য ফল দেয় ? আমি কি ভুলভাবে ব্যবহার করেছি ?fname"a.txt"|


3
ব্যাশে, 'বা' অপারেটরটি '||' (সি স্টাইল)
মারিয়াস কোটোফানা

3
আপনি -oএকই মধ্যে ব্যবহার করতে পারেন [ ]
থোর

6
@Thor ্যদসব ||এবং আলাদা [ ]উপর -oকেবল বহনযোগ্যতা কারণ [বলসিলাম 4 টার বেশি আর্গুমেন্ট সমর্থন করার জন্য নিশ্চিত নয়। অবশ্যই টার্গেট ভাষা হলে bash, কোন এক ব্যবহার করা উচিত [কোন পথে কারণ bashএর [[অনেক উপায়ে শ্রেয়।
jw013

2
@ jw013 ধন্যবাদ। এর মানে কি এই যে আমার if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]পরিবর্তে ব্যবহার করা উচিত if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]?
অ্যান্ড্রু

5
@ অ্যান্ড্রু এটি সঠিক, যদি আপনি শেবাংকে ঘোষণা bashকরছেন যেমন আপনি ইতিমধ্যে করছেন। এর একটি সুবিধা [[হ'ল এটি শব্দ বিভাজন (বিশেষ কেস) না করে তাই [[ $unquoted_var = string ]]নিরাপদ।
jw013

উত্তর:


225

আপনি যদি বলতে চান ORডাবল পাইপ ( ||) ব্যবহার করুন ।

if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]

(আসল ওপি কোডটি ব্যবহার |করে বাম পাশের আউটপুটটি কেবল ডানদিকে পাইপিং করা হত, একইভাবে কোনও সাধারণ পাইপ কাজ করে))


4
তদ্ব্যতীত, ||"স্ট্যান্ডার্ড যুক্তি" বা "না করুন - এটি শর্ট সার্কিট এবং দ্বিতীয় কমান্ডটি প্রথম ব্যর্থ হলেই চালিত হবে।
হোল্ডেনওয়েব

13
@ হোল্ডেনওয়েব আমি বেশ নিশ্চিত যে বেশিরভাগ আধুনিক অনুকূলিত ভাষা একইভাবে কাজ করে। ORপ্রথম শর্তটি যদি সত্য হয় তবে এটির দ্বিতীয় অবস্থার মূল্যায়ন করে সিপিইউ চক্র ব্যয় করার দরকার নেই ।
বাহামাত

1
আমি ভাবলাম বাশ পছন্দ হয়েছে ==তবে এই উত্তরটি দেখার পরে, আমি এটি সন্ধান করার সিদ্ধান্ত নিয়েছি। স্পষ্টতই, "এটি ব্যবহার করা যেতে পারে তবে মানক নয়"। আমি এই এখানে অন্যদের জন্য রাখা চাই যদি আপনার কৌতুহলী: stackoverflow.com/a/2237103
harperville

এই কি testman পৃষ্ঠা খুব বিশেষ পরামর্শ দেওয়া হচ্ছে
cdosborn

2
আপনি ডাবল বন্ধনী পরীক্ষাও ব্যবহার করতে পারেন - if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]](আপনি চাইলে বা এর সাথে অতিরিক্ত কার্যকারিতা যুক্ত থাকতে হয় [[ ]])।
হ্যাঙ্ককা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.