2013-02-09 22 views
7
$ cat test.sh 
set -eu 
echo "`wc -l < $DNE`" 
echo should not get here 

$ /bin/bash test.sh 
test.sh: line 2: DNE: unbound variable 

should not get here 

मैं बैश संस्करण 4.1.2 चला रहा हूं। क्या यह सुनिश्चित करने का कोई तरीका है कि सबहेल में अनबाउंड वैरिएबल के ऐसे सभी उपयोग स्क्रिप्ट को प्रत्येक कॉल को संशोधित किए बिना बाहर निकलने के कारण बाहर निकलते हैं?बैश अनबाउंड वैरिएबल सेट-एयू

+0

है। आप इसे स्वीकार करने पर विचार कर सकते हैं। – jww

+0

यह एक सभ्य विकल्प है लेकिन "प्रत्येक कॉल को संशोधित किए बिना" मूल प्रश्न की आवश्यकता को संबोधित नहीं करता है। यदि झंडे वांछित के रूप में किया जाता है, तो यह एक निश्चित स्थिति में प्रत्येक बार एक चर का उपयोग करने के लिए कुछ याद रखने की तुलना में अधिक सेट-एंड-भूल जाता है। – Jason

उत्तर

2

एक अस्थायी चर का उपयोग करें ताकि test.sh प्रक्रिया को wc की विफलता के बारे में पता चल सके। अब

#!/bin/bash 
set -eu 
out=$(wc -l < $DNE) 
echo $out 
echo should not get here 

, आप should not get here नहीं देखेंगे अगर WC में विफल रहता है: आप को बदल सकते हैं।

+1

धन्यवाद लेकिन अगर मैं हमेशा चीजों को सही ढंग से करने के लिए याद रख सकता हूं, तो मुझे उन सभी गलतियों को पकड़ने के लिए -उयू विकल्पों की आवश्यकता नहीं होगी जो बाश को अन्यथा छोड़ दें :) मैं बैश को बताने के लिए एक तरीका ढूंढ रहा हूं सभी कोड -ईयू को बदले बिना त्रुटियां लागू होती हैं। – Jason

+0

आप प्रत्येक कमांड के रिटर्न कोड की जांच करते हैं और उचित संदेश/त्रुटि हैंडलिंग प्रिंट करते हैं। - किसी भी विफलता से बाहर निकलने पर एक विकल्प वांछनीय है। बैश एक व्याख्या की गई भाषा है, इसलिए ऐसी खुशी केवल संकलित भाषाओं में हैं :) लेकिन यह यहां उचित विकल्प प्रदान करती है। –

+0

क्या आपको विश्वास है कि '-e' का उपयोग किए बिना ऐसा करने का कोई तरीका है? –

4

बेहतर समाधान चर sanitisation

#!/usr/bin/env bash 

set -eu 

if [[ ${1-} ]]; then 
    DNE=$1 
else 
    echo "ERROR: Please enter a valid filename" 1>&2 
    exit 1 
fi 

सुनिश्चित करने के लिए घुंघराले ब्रेसिज़ के अंदर चर नाम करने के लिए एक हाइफन डाल इस बैश sanely को संभालने के लिए चर अपरिभाषित जा रहा है की अनुमति देता है की तरह से। मैं भी अत्यधिक गूगल खोल स्टाइल गाइड को देख सलाह देते हैं, यह @ फिल के जवाब लिनक्स, ओएस एक्स, और Solaris पर काम किया एक महान संदर्भ https://google.github.io/styleguide/shell.xml

[[ -z ${variable-} ]] \ 
    && echo "ERROR: Unset variable \${variable}" \ 
    && exit 1 \ 
    || echo "INFO: Using variable (${variable})"