টর্নারি অপারেটর (? :) বাশে


441

এরকম কিছু করার উপায় আছে কি?

int a = (b == 5) ? c : d;

বাশ ব্যবহার করছেন?


1
@ ডটসিএইচের উত্তরগুলি দেখায় যে bash"টার্নারি অপারেটর" এর মতো কিছু রয়েছে তবে এর মধ্যে bash"শর্তসাপেক্ষ অপারেটর" বলা হয় expr?expr:expr( man bashগোটো বিভাগে "গাণিতিক মূল্যায়ন" দেখুন)। মনে রাখবেন bash"শর্তসাপেক্ষ অপারেটর" কৌতুকপূর্ণ এবং কিছু গ্যাচস রয়েছে।
ট্রেভর বয়েড স্মিথ

বাশের পূর্ণসংখ্যার জন্য একটি তিনটি অপারেটর রয়েছে এবং এটি পাটিগণিতের এক্সপ্রেশনের অভ্যন্তরে কাজ করে ((...))শেল গাণিতিক দেখুন ।
কোডফোরস্টার

1
@ কোডফোর্ডস্টার যেমন উল্লেখ করেছেন ঠিক তেমনিভাবে অপারেটর পাটিগণিতের সম্প্রসারণ $(( ))এবং পাটিগণিত মূল্যায়নের সাথে কাজ করে (( ))। এছাড়াও দেখুন https://mywiki.wooledge.org/ArithmeticExpression
কাই

উত্তর:


490

টেরিনারি অপারেটর ? :কেবলমাত্র স্বল্প ফর্মif/else

case "$b" in
 5) a=$c ;;
 *) a=$d ;;
esac

অথবা

 [[ $b = 5 ]] && a="$c" || a="$d"

103
নোট করুন যে =অপারেটর স্ট্রিং সমতার জন্য পরীক্ষা করে, সংখ্যার সমতা নয় (অর্থাত্ [[ 05 = 5 ]]মিথ্যা)। আপনি যদি সংখ্যার তুলনা করতে চান তবে -eqপরিবর্তে ব্যবহার করুন।
গর্ডন ডেভিসন

10
এটি সংক্ষিপ্ত ফর্মের আরও বেশিif/then/else
ভলিউরন

15
একটি টার্নারি অপারেটর প্রভাব পেতে শর্ট সার্কিট আচরণটি ব্যবহার করার একটি প্রতিভা উপায় :) :) :)
এমটিকে

6
কেন [[এবং]]? এটি ঠিক এর মতো কাজ করে: [$ b = 5] && a = "$ c" || a = "$ d"
kdubs

83
cond && op1 || op2কনস্ট্রাক্ট একটি সহজাত বাগ আছে, যদি op1কোন কারনের জন্য অশূন্য প্রস্থান অবস্থা হয়েছে, ফলে নীরবে হয়ে যাবে op2if cond; then op1; else op2; fiখুব একটা লাইন এবং ত্রুটি নেই।
ivan_pozdeev

375

কোড:

a=$([ "$b" == 5 ] && echo "$c" || echo "$d")

58
এটি অন্যের চেয়ে ভাল ... তৃতীয় অপারেটরটির বিষয়টি হ'ল এটি একটি অপারেটর, সুতরাং এটি যথাযথ প্রসঙ্গটি একটি অভিব্যক্তিতে রয়েছে, সুতরাং এটির অবশ্যই একটি মান ফেরত যেতে হবে।
নিক ফেরারি

2
এটি সবচেয়ে সংক্ষিপ্ত উপায়। সচেতন হন যে অংশটি echo "$c"যদি একটি এলিয়াসেড, বহু-রেখাযুক্ত কমান্ড (পছন্দ echo 1; echo 2) হয় তবে আপনার এটি বন্ধনীতে আবদ্ধ করা উচিত।
ম্যাট

2
এটি পরীক্ষিত কমান্ডের যে কোনও আউটপুটও ক্যাপচার করবে, (হ্যাঁ, এই বিশেষ ক্ষেত্রে আমরা "জানি" এটি কোনও উত্পাদন করে না)।
আইভান_পোজদেদেভ

8
অপারেটরগুলির এই শৃঙ্খলা কেবলমাত্র টের্নারি অপারেটরের মতো আচরণ করে যদি আপনি ইতিবাচক হন যে কমান্ডের পরে &&কোনও শূন্য-বহির্গমন স্থিতি থাকবে না। অন্যথায়, সফল হলেও ব্যর্থ হলে a && b || c "অপ্রত্যাশিতভাবে" চালানো হবে । cab
চিপনার

155

শর্তটি যদি কেবল কোনও ভেরিয়েবল সেট করা আছে কিনা তা পরীক্ষা করে দেখছে তবে আরও একটি ছোট আকার রয়েছে:

a=${VAR:-20}

নির্ধারিত হবে aএর মান VARযদি VAR, সেট করা হয় অন্যথায় এটি এটি ডিফল্ট মান নির্ধারণ করবে 20- এই এছাড়াও একটি অভিব্যক্তি ফলে হতে পারে।

মন্তব্যে অ্যালেক্স নোট হিসাবে, এই পদ্ধতির প্রযুক্তিগতভাবে "প্যারামিটার সম্প্রসারণ" বলা হয়।


6
এতে a=${1:-'my-hyphenated-text'}
হাইফেনের


10
@ জাস্টিন ওরোবেল - দুর্ভাগ্যক্রমে কোনও সিনট্যাক্স এর মতো নয় ${VAR:-yes:-no}
কেন উইলিয়ামস

76
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi

cond && op1 || op2অভিব্যক্তি অন্যান্য উত্তর প্রস্তাবিত একটি সহজাত বাগ আছে, যদি op1একটি অশূন্য প্রস্থান অবস্থা আছে, op2চুপটি ফলাফলের হয়ে; ত্রুটিটিও -eমোডে ধরা পড়বে না । সুতরাং, যে অভিব্যক্তি শুধুমাত্র যদি ব্যবহার করা নিরাপদ op1ব্যর্থ না পারে (যেমন, :, trueএকটি builtin, বা কোনো কার্যকলাপ (বিভাজন এবং OS কল) মতো ব্যর্থ হতে পারে ছাড়া পরিবর্তনশীল নিয়োগ করে থাকেন)।

""উদ্ধৃতি দ্রষ্টব্য । প্রথম জুটি $bশূন্যস্থান বা শ্বেতস্থান থাকলে কোনও সিনট্যাক্স ত্রুটি আটকাবে । অন্যরা একক স্পেসে সমস্ত সাদা স্থান অনুবাদ করতে বাধা দেবে।


1
আমি উপসর্গও দেখেছি, আমি বিশ্বাস করি [ "x$b" -eq "x" ]যে খালি স্ট্রিংয়ের জন্য বিশেষভাবে পরীক্ষা করা হত used আমি zsh দ্বারা ব্যবহৃত সিনট্যাক্সগুলি ব্যবহার করতে চাই (zshexpn ম্যানপেজে 'PARAMETER এক্সপেনশন') তবে আমি তাদের বহনযোগ্যতা সম্পর্কে খুব বেশি জানি না।
জন পি


46
(( a = b==5 ? c : d )) # string + numeric

31
এটি সংখ্যার তুলনা এবং অ্যাসাইনমেন্টের জন্য ভাল , তবে আপনি যদি স্ট্রিং তুলনা এবং অ্যাসাইনমেন্টের জন্য এটি ব্যবহার করেন তবে এটি (( ))0
অনাকাঙ্ক্ষিত

3
এটিও লেখা যেতে পারে:a=$(( b==5 ? c : d ))
জোয়েটউইডল

33
[ $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
ivan_pozdeev

2
ব্যবহার করুন :Bulit-ইন পরিবর্তে trueসংরক্ষণের জন্য execএকটি বহিস্থিত প্রোগ্রাম -ing।
টম হেল

@ivan_pozdeev ব্যবহার করার কোনও উপায় আছে &&.. ||এবং এখনও তাদের মধ্যে একটি ব্যর্থ কমান্ড ধরছেন ?
টম হ্যালে

2
@ টমহেল নং &&এবং ||সংজ্ঞা অনুসারে তাদের আগে পুরো কমান্ডের জন্য প্রয়োগ করুন। সুতরাং, যদি এর আগে আপনার দুটি কমান্ড থাকে (তারা কীভাবে একত্রিত হয় তা নির্বিশেষে), আপনি এটিকে কেবল তাদের একটিতে প্রয়োগ করতে পারবেন না অন্যটিতে নয়। আপনি পতাকা ভেরিয়েবলগুলি দিয়ে / / যুক্তি অনুকরণ করতে পারেন , তবে সেখানে / / যথাযথ থাকলে কেন বিরক্ত করবেন ? ifthenelseifthenelse
ivan_pozdeev

14

এলইটি কমান্ড সমর্থন মৌলিক অপারেটরদের এক হবে অধিকাংশ:

let a=b==5?c:d;

স্বাভাবিকভাবেই, এটি কেবল ভেরিয়েবল নির্ধারণের জন্য কাজ করে; এটি অন্যান্য আদেশগুলি কার্যকর করতে পারে না।


24
এটি ((...)) এর সমান সমান, সুতরাং এটি কেবল গণিতের এক্সপ্রেশনগুলির জন্য বৈধ
drAlberT

13

এখানে আরেকটি বিকল্প রয়েছে যেখানে আপনাকে কেবল একবার যে ভেরিয়েবলটি বরাদ্দ করতে হবে তা নির্দিষ্ট করতে হবে এবং আপনার নির্ধারিত অংশটি স্ট্রিং বা একটি সংখ্যা কিনা তা বিবেচ্য নয়:

VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`

শুধু একটি ভাবনা. :)


একটি বড় ক্ষয়ক্ষতি: এটি স্টাডাউটকেও ক্যাপচার করবে [ test ]। সুতরাং কন্সট্রাক্টটি কেবলমাত্র নিরাপদ যদি আপনি "জানেন" তবে কমান্ডটি স্টাডআউটে কিছুই আউটপুট দেয় না।
ivan_pozdeev

এছাড়াও স্ট্যাকওভারফ্লো / প্রশ্নগুলি /3953645/ternary-operator-in-bash/… সমান এবং আরও ভিতরে কোটেশন এবং উদ্ধার প্রয়োজন। স্থান সহনশীল সংস্করণটি দেখতে পাবেন VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
আইভান_পোজদেদেভ

8

নিম্নলিখিতগুলি আমার ব্যবহারের ক্ষেত্রে কাজ করে বলে মনে হচ্ছে:

উদাহরণ

$ 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"

7
খুব ব্যাখ্যামূলক। খুব সম্পূর্ণ। খুব ভার্জোজ। তিনটি জিনিস আমি পছন্দ করি। ;-)
জেসি চিশল্ম

2
হয় ternব্যাশ অংশ? ম্যাকের কাছে এটি নেই বলে মনে হচ্ছে
অবিচ্ছিন্নতা

4
আরে @ 太極 者 無極 而 生 - এটি বাশ স্ক্রিপ্টের নাম - উপরের "টার্ন" বিভাগটি "টার্ন" নামের একটি ফাইলে সংরক্ষণ করুন, তারপরে chmod 700 ternএকই ফোল্ডারে চালান । এখন ternআপনার টার্মিনালে আপনার একটি কমান্ড থাকবে
ব্র্যাড পার্কস

8

টার্নারি অপারেটরের জন্য আমরা শেল স্ক্রিপ্টিংয়ে নিম্নলিখিত তিনটি উপায় ব্যবহার করতে পারি:

    [ $numVar == numVal ] && resVar="Yop" || resVar="Nop"

Or

    resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")

Or

    (( numVar == numVal ? (resVar=1) : (resVar=0) ))

এটি আসলে (এই তিনটি উদাহরণের প্রথম এবং দ্বিতীয়) এই প্রশ্নের সবচেয়ে উপযুক্ত উত্তর আইএমএইচও।
নেটপোটিকা

6

বাশে টের্নারি শর্তাবলীর জন্য একটি খুব সমকালীন বাক্য গঠনও রয়েছে:

a=$(( b == 5 ? 123 : 321  ))

দুর্ভাগ্যক্রমে, এটি কেবল সংখ্যার সাথে কাজ করে - যতদূর আমি জানি।



4

আপনি যদি অনুরূপ বাক্য গঠন চান তবে এটি ব্যবহার করতে পারেন

a=$(( $((b==5)) ? c : d ))

এটি কেবল পূর্ণসংখ্যার সাথে কাজ করে। আপনি এটিকে আরও সহজভাবে লিখতে পারেন a=$(((b==5) ? : c : d))- $((...))তখনই প্রয়োজন হয় যখন আমরা পাটিগণিতের ফলাফল অন্য ভেরিয়েবলের কাছে অর্পণ করতে চাই।
কোডফোরস্টার

2

এখানে কিছু বিকল্প রয়েছে:

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"`

2

এখানে একটি সাধারণ সমাধান, এটি

  • স্ট্রিং টেস্টের পাশাপাশি কাজ করে
  • বরং ভাবের মতো অনুভব করে
  • শর্ত ব্যর্থ হলে কোনও সূক্ষ্ম পার্শ্ব প্রতিক্রিয়া এড়িয়ে যায়

সংখ্যার তুলনা সঙ্গে পরীক্ষা

a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)

স্ট্রিং তুলনা সঙ্গে পরীক্ষা

a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)


1

এটি অনেকটা ভ্লাদিমিরের সূক্ষ্ম উত্তরের মতো । যদি আপনার "টিনারারি" "যদি সত্য হয়, স্ট্রিং, যদি মিথ্যা হয়, খালি হয়" এর একটি মামলা হয়, আপনি কেবল তা করতে পারেন:

$ 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

1

এর উত্তর দিতে: 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

মনে রাখবেন যে "এক্সপ্রেশন" $ ((এক্সপ্রেশন)) এর সমান


0

একটি স্ট্রিং-ভিত্তিক বিকল্প, এটি একটি অ্যারে ব্যবহার করে:

spec=(IGNORE REPLACE)
for p in {13..15}; do
  echo "$p: ${spec[p==14]}";
done

কোন ফলাফল:

13: IGNORE
14: REPLACE
15: IGNORE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.