बैश त्रुटि, पंक्ति 8: $ 1: अनबाउंड चर


15

मैं यह जानने की कोशिश कर रहा हूं कि गेटटॉप्स का उपयोग कैसे किया जाए ताकि मेरे पास पार्स इनपुट के साथ स्क्रिप्ट हो सकें (हालांकि मुझे लगता है कि गेटटॉप्स बेहतर हो सकते हैं)। मैं विभाजन उपयोग प्रतिशत वापस करने के लिए एक सरल स्क्रिप्ट लिखने की कोशिश कर रहा हूं। समस्या यह है कि मेरे बैश कार्यों में से एक ऐसा नहीं लगता है कि मैं $1फ़ंक्शन के भीतर एक चर के रूप में संदर्भित करता हूं । कारण मैं संदर्भित करता हूं $1क्योंकि get_percentफ़ंक्शन को माउंट बिंदु के सभी के बजाय प्रदर्शित करने के लिए वैकल्पिक तर्क के रूप में एक माउंट बिंदु पारित किया जा सकता है।

लिपी

#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent(){
    if [ -n "$1" ] 
    then
        df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
    else
        df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
    fi
}

usage(){
    echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2
}

# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
    get_percent
    exit 0
fi
# ...

उत्पादन

$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable

मुझे नहीं लगता कि इससे कुछ लेना-देना है getopts, क्या ऐसा होता है? -uकॉल करने से पहले आपकी स्क्रिप्ट निकल जाती है getopts
ilkachachu

@ikkachu नहीं मुझे लगता है कि यह नहीं है। लेकिन मुझे यकीन नहीं है कि मैं अब खिताब बदल सकता हूं।
टिमोथी पुलिअम

पोस्ट के नीचे उस छोटे से "एडिट" टेक्स्ट होना चाहिए, एक सवाल में टैग के नीचे
ilkachachu

जवाबों:


29

set -uयदि आप एक चर का संदर्भ नहीं देते हैं जो सेट नहीं किया गया है, तो ठीक उसी तरह से आप वर्णन करेंगे। आप बिना किसी तर्क के अपनी स्क्रिप्ट का आह्वान कर रहे हैं, इसलिए get_percentबिना किसी तर्क के लागू किया जा रहा है, जिससे $1परेशान हो सकते हैं।

अपने फ़ंक्शन को लागू करने से पहले या तो इसके लिए जांच करें, या डिफ़ॉल्ट विस्तार का उपयोग करें ( यदि यह पहले से ही कुछ और के लिए सेट नहीं ${1-default}है defaultतो विस्तार होगा )।


मुझे इस पर संदेह था, लेकिन मैं इसके बारे में एक रास्ता नहीं सोच सकता था। डिफ़ॉल्ट विस्तार ने इसे ठीक कर दिया है। आपका बहुत बहुत धन्यवाद!
टिमोथी पुलिअम

7
विशेष रूप से, [ -n "${1-}" ]यह देखने के लिए कि पैरामीटर सेट किया गया है और गैर-रिक्त है, एक (खाली डिफ़ॉल्ट मान के साथ) का उपयोग कर सकता है ; या [ "${1+x}" = x ]यह देखने के लिए कि क्या यह सेट है, भले ही खाली हो।
लक्कू

मुझे अभी भी अनबाउंड चर त्रुटि का उपयोग करने के बावजूद मिलता हैif [[ -n ${1-default} ]]
चैतन्य बापट

@ChaitanyaBapat मैं तब भी साथ हो रहा था unbound variableजब तक मैं :-इसके बजाय इस्तेमाल करता था -। इसलिए, मेरे लिए कम से कम, ${1:-default}किसी अकेले व्यक्ति ने त्रुटि नहीं उठाई।
एडम बदुरा

6

यह का प्रभाव है set -u

आप $#फ़ंक्शन के अंदर की जाँच कर सकते हैं और $1यदि यह सेट नहीं है तो संदर्भ देने से बचें ।

साथ $#आप पैरामीटर की संख्या का उपयोग कर सकते हैं। वैश्विक संदर्भ में यह स्क्रिप्ट के मापदंडों की संख्या है, एक फ़ंक्शन में यह फ़ंक्शन के मापदंडों की संख्या है।

प्रश्न के संदर्भ में, यह है

if [ $# -ge 1 ] && [ -n "$1" ]
then
    df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
else
    df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
fi

ध्यान दें कि आपको उपयोग करना है [ $# -ge 1 ] && [ -n "$1" ]और नहीं [ $# -ge 1 -a -n "$1" ], क्योंकि यह पहले मूल्यांकन करेगा $1और फिर जांच करेगा $#


क्या आप अधिक बता सकते हैं कि $ # का उपयोग कैसे करें और इसे कैसे जांचें? धन्यवाद
चैतन्य बापट

1
मैंने एक उदाहरण जोड़ा।
राल्फफ्राइडल

3

चूंकि यह bashआप $1सेट होने के लिए चेक को साइडस्टेप कर सकते हैं और बस उपयोग कर सकते हैं "$@"( $1पहला पैरामीटर है, $@उन सभी में से; जब डबल-उद्धृत किया जाता है, तो यह पूरी तरह से गायब हो जाता है अगर इसमें कोई मूल्य नहीं है, जो इसे पकड़े जाने से बचा जाता है set -u):

get_percent() {
    df -h "$@" | awk 'NR>1 { printf "%s\t%s\n", $1, $5 }'
}

मैंने शेष पंक्ति को भी थोड़ा मोड़ दिया है ताकि आपको आपके द्वारा आउटपुट किए गए दो मानों के बीच {space} {tab} {space} न मिले, लेकिन आपको केवल {टैब} मिलता है। यदि आप वास्तव में दो अदृश्य स्थान चाहते हैं तो awkउपयोग करने के लिए बदल दें printf "%s \t %s\n", $1, $5


मुझे इस पर गौर करना होगा। मैं उस परिवर्तनशील प्रकार से परिचित नहीं हूँ। धन्यवाद
टिमोथी पुलिअम

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