2012-12-31 7 views
8

संभव डुप्लिकेट:
Ternary operator (?:) in Bashक्या कोई इनलाइन है - यदि बैश में असाइनमेंट (टर्नरी सशर्त) के साथ?

यदि यह AS3 या जावा थे, मैं निम्नलिखित करना होगा:

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt"; 

लेकिन खोल में, कि बेकार में जटिल लगता है, की आवश्यकता होती है कोड की कई पंक्तियां, साथ ही साथ दोहराए गए कोड का थोड़ा सा।

if [ $useDefault ]; then 
    fileName="$dirName/$defaultName.txt" 
else 
    fileName="$dirName/$customName.txt" 
fi 

आप सभी को एक पंक्ति में संपीड़ित कर सकते हैं, लेकिन यह स्पष्ट रूप से बलिदान देता है।

क्या शेल में परिवर्तनीय असाइनमेंट के साथ इनलाइन if लिखने का कोई बेहतर तरीका है?

+0

विलियम पर्ससेल का जवाब मेरा से कम प्रत्यक्ष है, लेकिन अगर धारणा '$ useDefault' का मानना ​​है कि डिफ़ॉल्ट नाम का उपयोग करना है या नहीं, तो यह एक क्लीनर समाधान हो सकता है। –

+0

मैंने सबकुछ ठीक से उद्धृत करने के लिए अपना उत्तर अपडेट कर दिया है। –

उत्तर

9

खोल में कोई ?: सशर्त ऑपरेटर नहीं है, लेकिन आप कोड इस तरह थोड़ा कम बेमानी बना सकता है:

if [ $useDefault ]; then 
    tmpname="$defaultName" 
else 
    tmpname="$customName" 
fi 
fileName="$dirName/$tmpname.txt" 

या आप अपने स्वयं के खोल समारोह है कि ?: ऑपरेटर की तरह काम करता लिख ​​सकते हैं:

cond() { 
    if [ "$1" ] ; then 
     echo "$2" 
    else 
     echo "$3" 
    fi 
} 

fileName="$dirname/$(cond "$useDefault" "$defaultName" "$customName").txt" 

हालांकि यह शायद अधिक है (और यह सभी तीन तर्कों का मूल्यांकन करता है)।

गॉर्डन डेविसन को टिप्पणियों में इंगित करने के लिए धन्यवाद जो $(...) के भीतर घोंसला उद्धृत करता है।

+0

मुझे वास्तव में 'cond' फ़ंक्शन पसंद है, यही कारण है कि मैंने जवाब स्वीकार कर लिया, हालांकि पहला समाधान दोहराव कोड भी बचाता है। – IQAndreas

+0

आपको डबल-कोट्स (यानी 'fileName = "$ dirname/$ (cond" $ useDefault "" $ defaultName "" $ customName ") के अंदर' $ (cond ...)' छोड़ना चाहिए। Txt "') - - जो स्ट्रिंग कंड रिटर्न पर लगभग निश्चित रूप से अवांछित अतिरिक्त पार्सिंग को रोक देगा। –

+0

@ गॉर्डन डेविसन: मैंने इसके बारे में सोचा, लेकिन यह उद्धरण के बाहर परिवर्तनीय संदर्भ '$ useDefault' et al छोड़ देता है। मुझे यकीन नहीं है कि एक अच्छा समाधान है। –

16

बस लिखें:

fileName=${customName:-$defaultName}.txt 

यह तुम्हारे पास क्या है के रूप में ही नहीं काफी है, क्योंकि यह useDefault जांच नहीं करता। इसके बजाए, यह जांचता है कि customName सेट है या नहीं। जब आप डिफ़ॉल्ट का उपयोग करना चाहते हैं तो useDefault सेट करने के बजाय, आप बस customName को अनसेट करें।

+0

क्या आप इस ':' ऑपरेटर पर अधिक जानकारी प्रदान कर सकते हैं? (या इसके लिए कम से कम कुछ नाम जो मैं Google के साथ खोज सकता हूं) – IQAndreas

+1

बस बैश मैन पेज में ': -' के लिए खोजें। कोई 'sh' दस्तावेज' पैरामीटर विस्तार 'जैसे शीर्षकों के तहत इसका वर्णन करेगा। –

+4

'bash' के लिए, [पैरामीटर विस्तार] देखें (http://www.gnu.org/software/bash/manual/bash.html#Shell- पैरामीटर- विस्तार); POSIX खोल के लिए, [पैरामीटर विस्तार] देखें (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02)। –

संबंधित मुद्दे