बश में एकल आदेश के साथ शेल चर के लिए डिफ़ॉल्ट मान असाइन करना


682

मेरे पास बैश (3.00) शेल स्क्रिप्ट में चर पर परीक्षणों का एक पूरा गुच्छा है जहां यदि चर सेट नहीं किया जाता है, तो यह एक डिफ़ॉल्ट प्रदान करता है, जैसे:

if [ -z "${VARIABLE}" ]; then 
    FOO='default'
else 
    FOO=${VARIABLE}
fi

मुझे याद है कि वहाँ एक पंक्ति में यह करने के लिए कुछ वाक्यविन्यास है, कुछ एक ternary ऑपरेटर जैसा दिखता है, जैसे:

FOO=${ ${VARIABLE} : 'default' }

(हालांकि मुझे पता है कि काम नहीं करेगा ...)

क्या मैं पागल हूं, या ऐसा कुछ मौजूद है?


1
बैश शैल संदर्भ का शेल पैरामीटर विस्तार खंड एक अच्छा प्रारंभिक स्थान है: tiswww.case.edu/php/chet/bash/bashref.html#Shell-Expansions
केमिन झोउ

1
शेल पैरामीटर विस्तार के लिए Gnu.org प्रलेखन (संकेत: आपके द्वारा किए जा सकने वाले अन्य बहुत अच्छे सामान हैं!)
JDB अभी भी मोनिका

जवाबों:


1226

वास्तव में आपने जो पोस्ट किया है, उसके बहुत करीब:

FOO=${VARIABLE:-default}  # If variable not set or null, use default.

या, जो आवंटित करेगा defaultकरने के लिए VARIABLEके रूप में अच्छी तरह से:

FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.

64
अगर मैं इसे प्रलेखन में ढूंढना चाहता था, तो इसके लिए Google क्या होगा? $ {: -} जैसे विशेष वर्णों के साथ गुगल करना बहुत आसान नहीं है।
जोशुआ ओल्सन

20
एकांतवादी के जवाब में: "बैश वैरिएबल असाइनमेंट डिफॉल्ट" मुझे इस पेज पर आने दें, और 'वैरिएबल
अस्सिट

57
ध्यान दें कि यह नहीं बैश विशेष और पूरे खोल-परिवार के साथ काम करेंगे। यह सामान्य लिपियों के लिए सुरक्षित है।
1948 को जॉलीलीने डलांडे

16
@solarmist कुंजी शब्द "बैश पैरामीटर विस्तार" है, यदि आप इसके और इसके साथियों के बारे में अधिक जानकारी प्राप्त करना चाहते हैं।
दुलाशी

20
यहाँ विषय unix.stackexchange.com/a/122848/2407
jottr

289

कमांड लाइन तर्क के लिए:

VARIABLE=${1:-DEFAULTVALUE}    

जो VARIABLEस्क्रिप्ट के लिए दिए गए 1 तर्क के मान को बताता है या DEFAULTVALUEयदि ऐसा कोई तर्क पारित नहीं किया गया है।


244

यदि चर समान है, तो

: "${VARIABLE:=DEFAULT_VALUE}"

परिभाषित नहीं होने पर VARIABLE को DEFAULT_VALUE असाइन करता है। दोहरे उद्धरण ग्लोबिंग और शब्द विभाजन को रोकते हैं।

बैश मैनुअल में धारा 3.5.3, शेल पैरामीटर विस्तार भी देखें ।


27
यह मुश्किल चाल मेरे लिए स्पष्ट नहीं थी, का उपयोग करते हुए: $ {..} के विस्तार को खाने के लिए कोई प्रभाव नहीं बनाया, लेकिन सेट छोड़ दिया। अब तक मैं यह कर रहा था: VARIABLE = "$ {VARIABLE: -DEFAULT_VALUE}" और VARIABLE का उपयोग करने के लिए दो बार महसूस करना।
डिनो

यह बैश-बिल्डिन वार्सिबल्स के लिए इस तरह से काम नहीं करता है। यह बहुत अजीब है। वर्तमान में मेरे लिए जाने जाने वाले लोग हैंHISTTIMEFORMAT
ओथियस

मैं कई डिफ़ॉल्ट मान कैसे सेट करूंगा? मैंने ": $ {VARIABLE: = DEFAULT_VALUE}: $ {VARIABLE2: = DEFAULT_VALUE2}" की कोशिश की, लेकिन यह काम नहीं करता ...
हंस

8
@ हंस: कोलन कमांड है (जो कुछ नहीं करता है) और इस तरह केवल एक बार की जरूरत है। उदा: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}
पेट्रीक

36

यहां तक ​​कि आप डिफ़ॉल्ट वैल्यू की तरह दूसरे वेरिएबल के मूल्य का उपयोग कर सकते हैं

फ़ाइल होना defvalue.sh

#!/bin/bash
variable1=$1
variable2=${2:-$variable1}

echo $variable1
echo $variable2

./defvalue.sh first-value second-valueउत्पादन चलाते हैं

first-value
second-value

और ./defvalue.sh first-valueआउटपुट चलाते हैं

first-value
first-value

28

3.5.3 (शेल पैरामीटर विस्तार) के तहत यहां देखें

आपके मामले में ऐसा है

${VARIABLE:-default}

26

आपके प्रश्न का उत्तर देने के लिए और सभी परिवर्तनीय प्रतिस्थापन पर

echo "$\{var}"
echo "Substitute the value of var."


echo "$\{var:-word}"
echo "If var is null or unset, word is substituted for var. The value of var does not change."


echo "$\{var:=word}"
echo "If var is null or unset, var is set to the value of word."


echo "$\{var:?message}"
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly."


echo "$\{var:+word}"
echo "If var is set, word is substituted for var. The value of var does not change."

18

FWIW, आप एक त्रुटि संदेश प्रदान कर सकते हैं जैसे:

USERNAME=${1:?"Specify a username"}

यह इस तरह एक संदेश प्रदर्शित करता है और कोड 1 से बाहर निकलता है:

./myscript.sh
./myscript.sh: line 2: 1: Specify a username

सब कुछ का एक और पूर्ण उदाहरण:

#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo "$ACTION"
echo "$DIRNAME"
echo "$OUTPUT_DIR"

आउटपुट:

$ ./script.sh foo
foo
/path/to/pwd
/tmp

$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
  • $ACTION पहले तर्क का मूल्य लेता है, और खाली होने पर बाहर निकालता है
  • $DIRNAME दूसरा तर्क है, और वर्तमान निर्देशिका में चूक है
  • $OUTPUT_DIR3 तर्क है, या $HOMEDIR(यदि परिभाषित किया गया है), और /tmp,। यह ओएस एक्स पर काम करता है, लेकिन मैं सकारात्मक नहीं हूं कि यह पोर्टेबल है।

17

फिर अपने 'यदि' को और अधिक स्पष्ट रूप से व्यक्त करने का तरीका है:

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}

10

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

#!/bin/bash

default='default_value'
value=${1:-$default}

echo "value: [$value]"

इसे script.sh के रूप में सहेजें और इसे निष्पादन योग्य बनाएं। इसे बिना परम के चलाएं

./script.sh
> value: [default_value]

इसे परम के साथ चलाओ

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