एक बैश स्क्रिप्ट में, "यदि" कथन में सशर्त "या" का उपयोग किया जाता है


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
@ मैं पसंद करूंगा ||और पोर्टेबिलिटी के लिए अलग [ ]कर दूंगा -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
@holdenweb मुझे पूरा यकीन है कि अधिकांश आधुनिक अनुकूलित भाषाएँ उसी तरह काम करती हैं। सीपीयू चक्र खर्च करने की आवश्यकता नहीं है ORअगर पहली शर्त सच का मूल्यांकन करती है तो दूसरी स्थिति का मूल्यांकन करें।
bahamat

1
मुझे लगा कि बैश पसंद है ==लेकिन इस जवाब को देखने के बाद, मैंने इसे देखने का फैसला किया। जाहिर है, "यह इस्तेमाल किया जा सकता है, लेकिन मानक नहीं है"। मैंने सोचा कि मैं इसे दूसरों के लिए यहाँ
रखूँगा

यह वही है जो testमैन पेज भी
सुझाता

2
आप डबल ब्रैकेट परीक्षणों का उपयोग भी कर सकते हैं - if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]](यदि आप चाहते हैं या अतिरिक्त कार्यक्षमता से जुड़े होने की आवश्यकता है [[ ]])।
हांकका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.