मैं वर्तमान में [[]] और मूल्यांकन कोड के साथ एक गतिशील परीक्षण करने की कोशिश कर रहा हूं, लेकिन एक -n है जो शर्तों की शुरुआत में स्वचालित रूप से जोड़ा जाता है। तो मेरी शर्तें हमेशा सच होती हैं...

यहां सेट -x के साथ एक उदाहरण:

myCondition='${queueName} == ${pattern}'
pattern="COMPLETELY_DIFFERENT_PATTERN"
queueName="QM.GCS.SRC.TOTO"
set -x ; [[ $(eval echo $myCondition ) ]] && echo CORRECT; set +x
++ eval echo '${queueName} == ${pattern}'
+++ echo QM.GCS.SRC.TOTO == COMPLETELY_DIFFERENT_PATTERN
+ [[ -n QM.GCS.SRC.TOTO == COMPLETELY_DIFFERENT_PATTERN ]]
+ echo CORRECT
CORRECT
+ set +x

-n क्यों जोड़ा जाता है? क्योंकि केवल एक पैरामीटर है?

मैं इसे अपनी इच्छानुसार कैसे काम कर सकता हूँ?

0
Lindmin 3 अक्टूबर 2018, 18:43

1 उत्तर

सबसे बढ़िया उत्तर

[[ स्ट्रिंग-विभाजन को स्पष्ट रूप से अक्षम करता है, जैसे कि एक विस्तार एकाधिक तर्कों में विभाजित नहीं होता है।

एक एकल-आइटम परीक्षण परोक्ष रूप से -n चलता है, यह परीक्षण करता है कि क्या वह आइटम खाली स्ट्रिंग है।

इस प्रकार, यदि आप चाहते हैं कि आपकी स्थिति के अंशों का मूल्यांकन [[ के लिए अलग-अलग तर्कों के रूप में किया जाए, तो आपके पास [[ के भीतर eval होना चाहिए, जैसे कि शर्त को उस टेक्स्ट से बदल दिया जाता है जिसमें पहले [[ के पार्सिंग नियम प्रभावी होते हैं।

eval "[[ $myCondition ]]"

इस प्रकार, यह आपका कोड बना देगा:

myCondition='${queueName} == ${pattern}'
pattern="COMPLETELY_DIFFERENT_PATTERN"
queueName="QM.GCS.SRC.TOTO"
set -x ; eval "[[ $myCondition ]]" && echo CORRECT; set +x

... जो अपेक्षित लॉग को stderr पर उत्सर्जित करता है:

+ eval '[[ ${queueName} == ${pattern} ]]'
++ [[ QM.GCS.SRC.TOTO == COMPLETELY_DIFFERENT_PATTERN ]]
+ set +x
0
Charles Duffy 3 अक्टूबर 2018, 15:47