क्या ऐसा कुछ करने का कोई तरीका है
int a = (b == 5) ? c : d;
बैश का उपयोग?
((...))
। शैल अंकगणित देखें ।
$(( ))
और अंकगणितीय मूल्यांकन के साथ काम करता है (( ))
। यह भी देखें https://mywiki.wooledge.org/ArithmeticExpression
।
क्या ऐसा कुछ करने का कोई तरीका है
int a = (b == 5) ? c : d;
बैश का उपयोग?
((...))
। शैल अंकगणित देखें ।
$(( ))
और अंकगणितीय मूल्यांकन के साथ काम करता है (( ))
। यह भी देखें https://mywiki.wooledge.org/ArithmeticExpression
।
जवाबों:
टर्नरी ऑपरेटर ? :
का संक्षिप्त रूप हैif/else
case "$b" in
5) a=$c ;;
*) a=$d ;;
esac
या
[[ $b = 5 ]] && a="$c" || a="$d"
=
ऑपरेटर स्ट्रिंग समानता के लिए परीक्षण करता है, न कि संख्यात्मक समानता (यानी [[ 05 = 5 ]]
गलत है)। यदि आप संख्यात्मक तुलना चाहते हैं, तो -eq
इसके बजाय का उपयोग करें ।
if/then/else
cond && op1 || op2
निर्माण एक अंतर्निहित बग है: अगर op1
किसी भी कारण से अशून्य बाहर निकलने का दर्जा प्राप्त है, परिणाम चुपचाप हो जाएगा op2
। if cond; then op1; else op2; fi
एक पंक्ति भी है और इसमें वह दोष नहीं है।
कोड:
a=$([ "$b" == 5 ] && echo "$c" || echo "$d")
echo "$c"
एक अलियास, मल्टी-लाइनेड कमांड (जैसे echo 1; echo 2
) है, तो आपको इसे कोष्ठक में संलग्न करना चाहिए।
&&
गैर-शून्य निकास स्थिति नहीं होगी। अन्यथा, a && b || c
"अप्रत्याशित रूप से" चलेंगे c
अगर a
सफल होता है, लेकिन b
विफल रहता है।
यदि कोई चर सेट कर रहा है, तो स्थिति केवल जाँच रही है, एक छोटा रूप भी है:
a=${VAR:-20}
करने के लिए आवंटित करेगा a
का मूल्य VAR
अगर VAR
, सेट किया गया है अन्यथा यह यह डिफ़ॉल्ट मान प्रदान करेंगे 20
- यह भी एक अभिव्यक्ति का एक परिणाम हो सकता है।
टिप्पणी में एलेक्स के रूप में, इस दृष्टिकोण को तकनीकी रूप से "पैरामीटर विस्तार" कहा जाता है।
a=${1:-'my-hyphenated-text'}
:-
)
${VAR:-yes:-no}
।
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi
cond && op1 || op2
अभिव्यक्ति अन्य उत्तर में सुझाव दिया एक अंतर्निहित बग है: अगर op1
एक अशून्य बाहर निकलने का दर्जा प्राप्त है, op2
चुपचाप परिणाम हो जाता है; त्रुटि भी -e
मोड में नहीं पकड़ी जाएगी । तो, वह अभिव्यक्ति केवल उपयोग करने के लिए सुरक्षित है यदि op1
कभी विफल नहीं हो सकती (जैसे, :
)true
अंतर्निहित, या किसी भी परिचालन (विभाजन और ओएस कॉल) की तरह है कि असफल हो सकता है बिना चर काम करते हैं)।
""
उद्धरणों पर ध्यान दें । यदि $b
रिक्त है या व्हाट्सएप है तो पहली जोड़ी एक वाक्यविन्यास त्रुटि को रोकेगी । अन्य सभी व्हाट्सएप के एकल स्थानों में अनुवाद को रोकेंगे।
[ "x$b" -eq "x" ]
विशेष रूप से खाली स्ट्रिंग के लिए परीक्षण किया जाता है। मुझे zsh ('PARAMETER EXPANSION' द्वारा zshexpn manpage) में प्रयुक्त सिंटैक्स का उपयोग करना पसंद है, लेकिन मुझे उनकी पोर्टेबिलिटी के बारे में ज्यादा जानकारी नहीं है।
(( a = b==5 ? c : d )) # string + numeric
(( ))
किसी भी / सभी तार के रूप में व्यवहार करता है0
a=$(( b==5 ? c : d ))
[ $b == 5 ] && { a=$c; true; } || a=$d
यह भाग के निष्पादन से बच जाएगा || जब गलती से && के बीच कोड और || विफल रहता है।
-e
मोड में त्रुटि को नहीं पकड़ेगा : (set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
->success 0 further on
:
बजाय bulit-in का उपयोग करें । true
exec
&&
.. ||
और फिर भी उनके बीच एक विफल कमांड को पकड़ते हैं?
&&
और ||
परिभाषा के अनुसार उनके सामने पूरे कमांड पर लागू होते हैं। इसलिए, यदि आपके पास इसके पहले दो कमांड हैं (चाहे वे कैसे संयुक्त हों), आप इसे केवल उनमें से एक पर लागू नहीं कर सकते हैं और दूसरे पर नहीं। आप कर सकते हैं का अनुकरण if
/ then
/ else
झंडा चर के साथ तर्क है, लेकिन वहाँ है कि अगर क्यों परेशान if
/ then
/ else
उचित?
यहां एक और विकल्प है जहां आपको केवल उस वेरिएबल को निर्दिष्ट करना है जिसे आप एक बार असाइन कर रहे हैं, और इससे कोई फर्क नहीं पड़ता कि आपका असाइनमेंट एक स्ट्रिंग या संख्या है:
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
सिर्फ एक विचार। :)
[ test ]
। तो निर्माण केवल उपयोग करने के लिए सुरक्षित है यदि आप "जानते हैं" कि कमांड स्टडआउट के लिए कुछ भी आउटपुट नहीं करता है।
VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
।
निम्नलिखित मेरे उपयोग के मामलों के लिए काम करता है:
$ tern 1 YES NO
YES
$ tern 0 YES NO
NO
$ tern 52 YES NO
YES
$ tern 52 YES NO 52
NO
और इस तरह से एक स्क्रिप्ट में इस्तेमाल किया जा सकता है:
RESULT=$(tern 1 YES NO)
echo "The result is $RESULT"
function show_help()
{
echo ""
echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}"
echo ""
echo "e.g. "
echo ""
echo "tern 1 YES NO => YES"
echo "tern 0 YES NO => NO"
echo "tern "" YES NO => NO"
echo "tern "ANY STRING THAT ISNT 1" YES NO => NO"
echo "ME=$(tern 0 YES NO) => ME contains NO"
echo ""
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$3" ]
then
show_help
fi
# Set a default value for what is "false" -> 0
FALSE_VALUE=${4:-0}
function main
{
if [ "$1" == "$FALSE_VALUE" ]; then
echo $3
exit;
fi;
echo $2
}
main "$1" "$2" "$3"
tern
बैश का हिस्सा है? मैक ऐसा प्रतीत नहीं होता है
chmod 700 tern
उसी फोल्डर में रन करें । अब आपके पास tern
अपने टर्मिनल में एक कमांड होगी
हम टर्नररी ऑपरेटर के लिए शेल स्क्रिप्टिंग में निम्नलिखित तीन तरीकों का उपयोग कर सकते हैं:
[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"
Or
resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")
Or
(( numVar == numVal ? (resVar=1) : (resVar=0) ))
बैश में टर्नरी कंडीशन के लिए एक बहुत ही बेहतरीन सिंटैक्स है:
a=$(( b == 5 ? 123 : 321 ))
दुर्भाग्य से, यह केवल संख्याओं के साथ काम करता है - जहां तक मुझे पता है।
यदि आप समान सिंटैक्स चाहते हैं तो आप इसका उपयोग कर सकते हैं
a=$(( $((b==5)) ? c : d ))
a=$(((b==5) ? : c : d))
- $((...))
केवल तभी आवश्यक है जब हम अंकगणित के परिणाम को दूसरे चर पर निर्दिष्ट करना चाहते हैं।
यहाँ कुछ विकल्प दिए गए हैं:
1- अगर एक लाइन में और उपयोग करें, तो यह संभव है।
if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi
2- इस तरह एक समारोह लिखें:
# Once upon a time, there was an 'iif' function in MS VB ...
function iif(){
# Echoes $2 if 1,banana,true,etc and $3 if false,null,0,''
case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac
}
स्क्रिप्ट का इस तरह से उपयोग करें
result=`iif "$expr" 'yes' 'no'`
# or even interpolating:
result=`iif "$expr" "positive" "negative, because $1 is not true"`
3- केस जवाब में प्रेरित, अधिक लचीला और एक लाइन का उपयोग होता है:
case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac
# Expression can be something like:
expr=`expr "$var1" '>' "$var2"`
यहाँ एक सामान्य समाधान है, कि
संख्यात्मक तुलना के साथ टेस्ट करें
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
स्ट्रिंग तुलना के साथ परीक्षण
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
यह व्लादिमीर के ठीक जवाब की तरह है । यदि आपका "टर्नरी" "अगर सच, स्ट्रिंग, यदि गलत, खाली" का मामला है, तो आप बस कर सकते हैं:
$ c="it was five"
$ b=3
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
$ b=5
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
it was five
इसका उत्तर देना है: int a = (b == 5) ? c : d;
बस लिखें:
b=5
c=1
d=2
let a="(b==5)?c:d"
echo $a # 1
b=6;
c=1;
d=2;
let a="(b==5)?c:d"
echo $a # 2
याद रखें कि "अभिव्यक्ति" $ (अभिव्यक्ति) के बराबर है
bash
इसमें "टर्नरी ऑपरेटर" के समान कुछ है लेकिनbash
इसे "सशर्त ऑपरेटर" कहा जाता हैexpr?expr:expr
(man bash
गोटो सेक्शन "अंकगणितीय मूल्यांकन")। ध्यान रखेंbash
"सशर्त ऑपरेटर" मुश्किल है और इसके पास कुछ गोचर्स हैं।