बश असाइन डिफ़ॉल्ट मान


135

$ {पैरामीटर: = शब्द} डिफ़ॉल्ट मान निर्दिष्ट करें। यदि पैरामीटर परेशान या अशक्त है, तो शब्द का विस्तार पैरामीटर को सौंपा गया है। पैरामीटर का मान तब प्रतिस्थापित किया जाता है। स्थितिगत पैरामीटर और विशेष पैरामीटर को इस तरह से नहीं सौंपा जा सकता है।

मुझे लगा कि मैं इस सुविधा का उपयोग ${LONG_VARIABLE_NAME:=hello}लंबे समय के बजाय लिखने के लिए कर सकता हूं LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}, लेकिन अब बैश भी 'हैलो' को निष्पादित करने की कोशिश करता है और यह एक कमांड देता है जो नहीं मिला। किसी भी तरह से बचने के लिए? या मुझे बाद में रहना पड़ेगा? क्या कोई उदाहरण दे सकता है कि असाइन किया गया डिफॉल्ट वास्तव में उपयोगी है?


13
पाठ को उद्धृत करते समय स्रोत से लिंक शामिल करना सहायक होता है।
जोनाथन रेनहार्ट

जवाबों:


202

एक बृहदान्त्र का प्रयोग करें:

: ${A:=hello}

बृहदान्त्र एक शून्य आदेश है जो कुछ भी नहीं करता है और इसके तर्कों को अनदेखा करता है। यह बैश में बनाया गया है, इसलिए एक नई प्रक्रिया नहीं बनाई गई है।


93
मैं मदद नहीं कर सकता, लेकिन निरीक्षण करता हूं कि : ${A:=hello}जब तक यह ठीक है A=${A:-hello}। यह भी लगता है कि उत्तरार्द्ध थोड़ा कम गूढ़ है और इसकी मंशा अधिक स्पष्ट है। का उपयोग करते हुए :, जो मूल रूप से एक सेशन नहीं है, ओपी के पहले जिस तरह से कर रहा था, उसकी तुलना में यह हास्यास्पद लगता है।
Dan Molding

5
@camh: सहमत। मैं देख सकता हूं कि, अगर आपके पास चूक को शुरू करने के लिए बहुत सारे चर हैं और उनके पास लंबे नाम हैं, तो :दृष्टिकोण बेहतर होगा, टाइपिंग के लिए और पढ़ने के लिए। हां, यह एक ऐसे क्षेत्र की तरह लगता है जहां बैश थोड़ा सुधार का उपयोग कर सकता है।
डैन मोल्डिंग

17
@DanMoulding: क्या : ${VERY_LONG_VARIABLE_NAME:=hello}बनाम के बारे में VERY_LONG_VARIABLE_NAME=${VERY_LONG_VARIABLE_NAME:-hello}:। मुझे आशा है कि आप अपने कोड में वर्णनात्मक चर नामों का उपयोग करते हैं :)
pihentagy

18
न केवल छोटा, बल्कि कम त्रुटि वाला VERY_LONG_VARIABLE_NAME=${VERY_LOGN_VARIABLE_NAME:-hello}:। उफ़।
chepner

5
A=$A:-helloदृष्टिकोण का एक फायदा यह है कि इसके साथ चलने पर इसका स्व-दस्तावेजीकरण होता है set -x। यही है, असाइनमेंट के रूप में मुद्रित करेगा, A=helloजबकि अशक्त कमांड केवल मूल्य ( hello) प्रिंट करेगा ।
lmsurprenant

107

कृपया उदाहरणों के लिए http://www.tldp.org/LDP/abs/html/parameter-substitution.html देखें

${parameter-default}, ${parameter:-default}

यदि पैरामीटर सेट नहीं है, तो डिफ़ॉल्ट का उपयोग करें। कॉल के बाद, पैरामीटर अभी भी सेट नहीं है।
दोनों रूप लगभग बराबर हैं। अतिरिक्त :केवल तभी अंतर करता है जब पैरामीटर घोषित किया गया है, लेकिन अशक्त है।

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

${parameter=default}, ${parameter:=default}

यदि पैरामीटर सेट नहीं है, तो डिफ़ॉल्ट पर पैरामीटर मान सेट करें।
दोनों लगभग बराबर हैं। : केवल तभी फर्क पड़ता है जब पैरामीटर घोषित किया गया है और शून्य है

# sets variable without needing to reassign
# colons suppress attempting to run the string
unset EGGS
: ${EGGS=spam}
echo 1 $EGGS     # 1 spam
unset EGGS
: ${EGGS:=spam}
echo 2 $EGGS     # 2 spam

EGGS=
: ${EGGS=spam}
echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
EGGS=
: ${EGGS:=spam}
echo 4 $EGGS     # 4 spam

EGGS=cheese
: ${EGGS:=spam}
echo 5 $EGGS     # 5 cheese
EGGS=cheese
: ${EGGS=spam}
echo 6 $EGGS     # 6 cheese

${parameter+alt_value}, ${parameter:+alt_value}

यदि पैरामीटर सेट है, तो alt_value का उपयोग करें, अन्यथा नल स्ट्रिंग का उपयोग करें। कॉल के बाद, पैरामीटर मान नहीं बदला गया।
दोनों लगभग बराबर हैं। : केवल तभी फर्क पड़ता है जब पैरामीटर घोषित किया गया है और शून्य है

unset EGGS
echo 1 ${EGGS+spam}  # 1
echo 2 ${EGGS:+spam} # 2

EGGS=
echo 3 ${EGGS+spam}  # 3 spam
echo 4 ${EGGS:+spam} # 4

EGGS=cheese
echo 5 ${EGGS+spam}  # 5 spam
echo 6 ${EGGS:+spam} # 6 spam

20

डिफ़ॉल्ट मूल्य पैरामीटर विस्तार अक्सर स्क्रिप्ट बनाने में उपयोगी होता है, जैसे नीचे एक उदाहरण। यदि उपयोगकर्ता स्क्रिप्ट को केवल-के रूप में कहता है, तो पर्ल का निर्माण नहीं किया जाएगा। उपयोगकर्ता को इसे बनाने के लिए स्पष्ट रूप WITH_PERLसे "नहीं" के अलावा किसी अन्य मान पर सेट करना होगा।

$ cat defvar.sh
#!/bin/bash

WITH_PERL=${WITH_PERL:-no}

if [[ "$WITH_PERL" != no ]]; then
    echo "building with perl"
    # ./configure --enable=perl
else
    echo "not building with perl"
    # ./configure
fi

पर्ल के बिना निर्माण

$ ./defvar.sh
not building with perl

पर्ल के साथ निर्माण

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