बैश-जब बाहर निकलता है तो 0 या मूल्यांकन का मूल्यांकन करता है


19

मेरे पास एक बैश स्क्रिप्ट है, जो सेट करती है-इसलिए स्क्रिप्ट किसी भी निकास स्थिति पर बाहर निकल जाएगी! = 0।

मैं कुछ बुनियादी शेल अंकगणित करने की कोशिश कर रहा हूं जो चर को सौंपा गया है और कभी-कभी अभिव्यक्ति 0 के बराबर होती है जो लेट या एक्सआर कमांड के बाहर निकलने की स्थिति का कारण "1" है।

यहाँ एक उदाहरण है:

#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"

आउटपुट है:

$ ./test_error.sh 
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo 'Z will print'
Z will print
+ let 'A=4 - 4'

मेरा प्रश्न यह है कि मुहावरेदार बैश स्क्रिप्टिंग तरीका क्या स्क्रिप्ट को वास्तविक निकास त्रुटियों पर विफल करने की अनुमति देता है और बुनियादी अंकगणितीय बराबरी पर नहीं। 0. मैं उन सभी भावों का प्रत्यय कर सकता हूं:

A=`expr $C - $D`    || true

लेकिन ऐसा लगता है कि हैक है।

जवाबों:


16

exprअंकगणित के लिए उपयोग न करें । यह लंबे समय तक अप्रचलित रहा है: शेल में अब $((…))निर्माण (POSIX) के साथ या letबिल्टिन (ksh / bash / zsh) या ((…))निर्माण (ksh / bash / zsh) के साथ अंकगणित का निर्माण किया गया है ।

letऔर ((…))अंतिम मूल्यांकन अभिव्यक्ति 0. है तो 1 (एक विफलता स्थिति कोड)। इससे बचने के लिए अपनी स्क्रिप्ट से बाहर निकलें set -e, अंतिम अभिव्यक्ति के लिए व्यवस्था न करें 0, उदाहरण के लिए:

let "a = 2 - 2" 1
((a = 2 - 2, 1))

वैकल्पिक रूप से, || trueमुहावरे का उपयोग करें :

((a = 2 - 2)) || true

वैकल्पिक रूप से, अपने अंकगणित को अंदर $((…))और अपने असाइनमेंट को बाहर करें। एक असाइनमेंट मान में अंतिम कमांड प्रतिस्थापन की स्थिति देता है, या यदि कोई कमांड प्रतिस्थापन नहीं है, तो आप सुरक्षित हैं। यह किसी भी POSIX शेल (जैसे डैश) में काम करने का अतिरिक्त लाभ है।

a=$((2 - 2))

1

$(( $C - $D ))इसके बजाय अपने अंकगणित के लिए उपयोग करें । यह अधिक कुशल भी है।


यह कहने से अधिक कुशल क्या है (( A = $C - $D ))?
बिशप

1

मुझे भी यही समस्या थी । tl; डॉ:

यदि अंतिम ARG [चलो] 0 का मूल्यांकन करता है, तो रिटर्न 1 दें; 0 रिटर्न दें अन्यथा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.