तार्किक और एक बैश स्क्रिप्ट में


10

मेरे पास ifमेरी बैश स्क्रिप्ट है जिसमें यह जांचना है कि 2 फाइलों में से कोई मौजूद है या नहीं, अगर वे मौजूद नहीं हैं तो यह इको मैच होना चाहिए।

कोड मेरे पास है:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

लेकिन यह किसी कारण से काम नहीं करता है।

मुझे 110% यकीन है कि ये 2 फाइलें मौजूद नहीं हैं। मुझे कोई त्रुटि नहीं है, यह सिर्फ दर्ज नहीं करता है if

मैं स्क्रिप्टिंग को कोसने के लिए नया हूं इसलिए मुझे यकीन नहीं है कि क्या गलत हो सकता है।


मुझे नहीं लगता कि पोस्ट किए गए किसी भी उत्तर में वास्तव में प्रश्न का पता है। जब आप व्यक्तिगत रूप से परीक्षणों की कोशिश करते हैं तो क्या होता है? [[ ! -f /etc/.../... ]]; echo $?प्रत्येक के लिए करो ।
jw013

एक चेतावनी : [[ -f xxx ]]अगर Xxx मौजूद है और एक नियमित फ़ाइल (या एक नियमित फ़ाइल के लिए एक सिमलिंक) सच है । यदि यह मौजूद नहीं है या यह मौजूद है या नहीं, तो यह गलत है, या अगर यह मौजूद है, लेकिन यह एक नियमित फ़ाइल (निर्देशिका, पाइप, डिवाइस, सॉकेट ...) नहीं है या यदि यह एक सिमलिंक है, तो यह गलत होगा। एक फ़ाइल जो मौजूद नहीं है या यह नहीं बता सकती है कि यह मौजूद है या नहीं या नियमित फ़ाइल नहीं है ... [[ -e $file ]] || [[ -L $file ]]अस्तित्व के लिए एक परीक्षण के करीब है। ls -d -- "$file" > /dev/null 2>&1और भी करीब है। और एक नियम के रूप में, इस तरह की परीक्षा में दौड़ की स्थिति होती है। शायद एक और तरीका है।
स्टीफन चेजलस

जवाबों:


12

अगर आप भी चाहते हैं तो आप चाहते हैं OR, नहीं AND

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • यह मेल करेगा यदि या तो या दोनों फाइलें गायब हैं।
  • आपका कोड तभी प्रिंट होगा matchजब दोनों मौजूद नहीं होंगे।

लेकिन , आपने कहा:

मुझे 110% यकीन है कि ये 2 फाइलें मौजूद नहीं हैं। मुझे कोई त्रुटि नहीं है, यह सिर्फ अगर दर्ज नहीं करता है।

अतः आपका कथन स्वयं विरोधाभासी है। यदि आप उस कोड को चला रहे हैं, तो कम से कम एक फाइल मौजूद होनी चाहिए

यदि आप यह देखना चाहते हैं कि आपका ifकथन कैसे मूल्यांकन कर रहा है, तो इसे चलाएं -x

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

फिर आप निष्पादन देखेंगे।

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 

मैं यह चाहता हूं कि अगर "फाइल" मौजूद नहीं है तो "मैच" को एको करें, यदि कोई मौजूद नहीं है तो वह प्रिंट मैच नहीं करता है। मैं इसे -x
Peppercat101

उस स्थिति में आपका मूल कोड ठीक होना चाहिए। और वास्तव में यह मेरे लिए काम करता है।
bahamat

3

क्या ऐसा नहीं होना चाहिए? A एक फाइल है या B एक फाइल है, फिर ब्लाब्ला है।

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi

3

यह भी आप क्या करने की कोशिश कर रहे हैं के लिए काम कर सकते हैं। एकल ब्रैकेट को आमतौर पर आज बैश के साथ उपयोग नहीं किया जाता है, लेकिन यह अभी भी एक विकल्प है। '-O' का प्रयोग प्रभावी रूप से एक "OR" ऑपरेशन है, और "!" स्थिति को नकारता है।

var=/etc/benchmarking/code
[ ! -f ${var} -o -f {var}.class ] && echo "match"

कभी उपयोग न करें [में bash। इसके अलावा, मैं यह देखने में विफल रहता हूं कि यह प्रश्न का उत्तर कैसे देता है।
jw013

[ ! -f ${var} -a ! -f {var}.class ] && echo "match"यह होना चाहिए। खोज थी: यदि वे (दोनों) मौजूद नहीं हैं, तो यह नहीं होना चाहिए echo match
15

0

आपका कोड आपकी आवश्यकताओं को पूरा करता है: यह प्रिंट करेगा matchकि यह या तो फ़ाइल नहीं ढूंढ सकता है।

इसलिए कारण matchमुद्रित नहीं किया जा रहा है कहीं और। आपको यह पुष्टि करनी चाहिए कि कोड ब्लॉक तक पहुँचा जा रहा है, जिसे आप कुछ डिबग संदेश के साथ आस-पास कर सकते हैं। उदाहरण के लिए, इस तरह:

echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
echo '@ Finished if...fi block'

मेरे सामान्य वरीयता संदेशों डिबगिंग के लिए जाने के लिए है stderr करने के लिए डेटा का प्रवाह बाधित होने से बचाने के लिए के रूप में तो stdout , लेकिन मुझे लगता है कि यहाँ से परहेज किया क्योंकि आप ने कहा कि आप अभी शुरुआत कर रहे थे। यहाँ एक उदाहरण दिखाया गया है कि आप stdout को कैसे लिख सकते हैं :

echo '@ About to enter if...fi block' >&2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.