यदि कोई चर परिभाषित नहीं है, तो स्क्रिप्ट को चलाने से बचें


18

मेरे पास एक स्क्रिप्ट दिखती है:

c=0
for f in */*; do
cp -v "$f" "/myhome/CE$(printf '%0*d' 2 $BATCHNUM)-new-stuctures_extracted/test-$(printf '%0*d' 5 $c)"
c=$((c=c+1))
done

हालाँकि, उपयोगकर्ता को BATCHNUM एक वैरिएबल कॉल प्रदान करना चाहिए और अन्यथा मुझे इस स्क्रिप्ट को चलाने से रोकने की आवश्यकता है। यह बेहतर होगा यदि मैं उस स्क्रिप्ट को मजबूर कर सकता हूं जो इस स्क्रिप्ट को कॉल करने के लिए मजबूर करती है (या # 1 स्क्रिप्ट जो # 2 स्क्रिप्ट को कॉल करती है जो इस स्क्रिप्ट को कॉल करती है)।

जवाबों:


30

स्क्रिप्ट की शुरुआत के लिए इन दो पंक्तियों को जोड़ने का सबसे तेज़ तरीका है:

set -u # or set -o nounset
: "$BATCHNUM"

पहली पंक्ति nounsetस्क्रिप्ट को चलाने वाले शेल में विकल्प को सेट करती है, जो अगर आप एक अनसेटेड वेरिएबल का विस्तार करने की कोशिश करते हैं, तो गर्भपात हो जाता है; दूसरा $BATCHNUMकुछ नहीं करने से पहले गर्भपात को ट्रिगर करने के लिए, नो-ऑप के संदर्भ में फैलता है।

यदि आप एक अधिक उपयोगी त्रुटि संदेश चाहते हैं, तो आप इसके बजाय लिख सकते हैं:

if [[ -z "$BATCHNUM" ]]; then
    echo "Must provide BATCHNUM in environment" 1>&2
    exit 1
fi

या इसी के समान।


18

यहां आप जांच करना चाहते हैं BATCHNUM सेट किया गया है और शून्य नहीं है।

इस कार्य के लिए POSIX शेल एक पैरामीटर विस्तार प्रदान करता है । उपयोग करने से पहले बस इस पंक्ति को जोड़ना BATCHNUM:

: "${BATCHNUM:?Variable not set or empty}"

BATCHNUMयदि उपयोगकर्ता एक प्रदान नहीं करता है तो डिफ़ॉल्ट मान सेट करना बेहतर है :

: "${BATCHNUM:=3}"

4
[ -n "$BATCHNUM" ] || { kill "$PPID"; exit 1; }
#Unless $BATCHNUM is defined and unempty, ask parent process to exit and exit w/ 1

यह bash पर और POSIX श में काम करेगा। मैं खाली चर और अपरिभाषित चर के बीच अंतर नहीं करना पसंद करता हूं (यानी, मुझे पसंद नहीं है set -u, लेकिन यह सिर्फ मेरे लिए है)।


2

रेखाएं

if [ -z "$BATCHNUM" ]; then
    exit 2;
fi

खाली के लिए जाँच करें $BATCHNUM$PPIDआप अपने माता-पिता को जो भी नुकसान चाहते हैं, उसके साथ कर सकते हैं kill $PPID। अपने दादा-दादी की हत्या करने के लिए, आपको अन्य तरीकों से प्रक्रिया आईडी प्राप्त करने की आवश्यकता है, जैसे डेटा को देखना/proc/$PPID

हालाँकि, यदि आपके माता-पिता की मृत्यु हो जाती है, तो यह आपको एक संकेत ( SIGHUP) भेजता है , इसलिए आपको किसी को मारने से पहले उसे फँसाना होगा:

trap '' SIGHUP

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


1
थोड़ा क्रूर .... :)
16:40 पर उपयोगकर्ता 40780

1

BATCHNUMयह निर्धारित करने के लिए कि क्या परीक्षण करना है, और बाहर निकलना तो नहीं:

if [ -n "${BATCHNUM-a}" ]; then
  echo >&2 "Fatal error: BATCHNUM not set"
  exit 2
fi

यदि आप उस मामले को अस्वीकार करना चाहते हैं जहां BATCHNUMखाली है, तो ${BATCHNUM:+a}इसके बजाय का उपयोग करें ${BATCHNUM+a}${VARIABLE+TEXT_IF_NULL}पैरामीटर विस्तार निर्माण के बारे में जानकारी के लिए , उदाहरण के लिए bash मैनुअल देखें

मूल प्रक्रिया को मत मारो। आपको नहीं पता कि मूल प्रक्रिया क्या है। यदि कुछ स्क्रिप्ट जो इसे कॉल करती है, तो यदि यह स्क्रिप्ट गर्भपात करती है, तो इसे इस स्क्रिप्ट की निकास स्थिति की जाँच करें। जैसे स्क्रिप्ट # 2 में:

script3 || exit $?

या set -eयदि कोई कमांड विफलता (नॉनज़ेरो) की स्थिति देता है तो स्क्रिप्ट को निरस्त करने के लिए उपयोग करें।

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