විධානයක් සාර්ථක හෝ අසමත් වුවහොත් කොන්දේසි සහිතව යමක් කරන්නේ කෙසේද?


340

මම මේ වගේ දෙයක් කඩිනමින් කරන්නේ කෙසේද?

if "`command` returns any error";
then
    echo "Returned an error"
else
    echo "Proceed..."
fi

Answers:


417

විධානයක් සාර්ථක හෝ අසමත් වුවහොත් කොන්දේසි සහිතව යමක් කරන්නේ කෙසේද?

බාෂ්ගේ ifප්‍රකාශය කරන්නේ එයයි :

if command ; then
    echo "Command succeeded"
else
    echo "Command failed"
fi

අදහස් වලින් තොරතුරු එකතු කිරීම: මෙම අවස්ථාවේදී ... සින්ටැක්ස් භාවිතා කිරීමට ඔබට අවශ්‍ය නැත . එයම බොහෝ දුරට සමාන විධානයකි . එය බොහෝ විට භාවිතා කළ හැකි වඩාත් පොදු විධානය වන අතර , එය කවචයේ වාක්‍ය ඛණ්ඩයේ කොටසක් යැයි උපකල්පනය කළ හැකිය. නමුත් විධානයක් සාර්ථකද නැද්ද යන්න පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නම් , ඉහත පෙන්වා ඇති පරිදි විධානය සෘජුවම භාවිතා කරන්න .[][testifif


13
අර්ධ සළකුණ වැදගත් බව සලකන්න.
Thorbj Rrn Ravn Andersen

24
නැතහොත් ඔබට thenවෙනම රේඛාවක් දැමිය හැකිය .
l0b0

39
Oe ජෝ: මම හිතන්නේ ඔයා අදහස් කලේ if ! command ; then ... ; fi. [එයම විධානයක් වන අතර එය මේ අවස්ථාවේ දී අවශ්‍ය නොවේ.
කීත් තොම්සන්

21
Oe ජෝ: මගේ මාර්ගය නිවැරදි වීමේ ගුණාංගය ද ඇත. if [ ! command ]ක්‍රියාත්මක නොකරයි command; එය commandනූලක් ලෙස සලකන අතර එය ශුන්‍ය නොවන දිගක් ඇති බැවින් එය සත්‍ය ලෙස සලකයි. [යනු testවිධානයට සමාන
පදයකි

6
අපොයි. ඔබ නිවැරදිය.
ජෝ

154

ෂෙල් විධානයක් ක්‍රියාත්මක වන්නේ නම් ඔබට සිදුවීමට අවශ්‍ය කුඩා දේවල් සඳහා, ඔබට &&ඉදිකිරීම් භාවිතා කළ හැකිය :

rm -rf somedir && trace_output "Removed the directory"

ෂෙල් විධානයක් අසමත් වූ විට ඔබට සිදුවීමට අවශ්‍ය කුඩා දේවල් සඳහාද ඔබට භාවිතා කළ හැකිය ||:

rm -rf somedir || exit_on_error "Failed to remove the directory"

නැත්නම් දෙකම

rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"

මෙම ඉදිකිරීම් සමඟ බොහෝ දේ කිරීම අ wise ාන දෙයක් විය හැකි නමුත් ඇතැම් විට ඒවාට පාලනයේ ප්‍රවාහය වඩාත් පැහැදිලි කළ හැකිය.


4
ඒවා කෙටි වන අතර (අවම වශයෙන් සමහර ෂෙල් වෙඩි වල) වේගවත් වේ. මම වරක් තේරුම් ගැනීමට උත්සාහ කළ මෙම කොන්දේසි සහිත ඉදිකිරීම් සමඟ ලියා ඇති රාක්ෂයා අල්ට්‍රික්ස් ස්ථාපන ස්ක්‍රිප්ට් එකක් සිහිපත් කරමි ...
වොන්බ්‍රෑන්ඩ්

118

$?නවතම විධානය / ශ්‍රිතය ක්‍රියාත්මක කිරීමේ ප්‍රති result ලය අඩංගු වන අගය පරීක්ෂා කරන්න :

#!/bin/bash

echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
  echo success
else
  echo failed
fi

if [ $RESULT == 0 ]; then
  echo success 2
else
  echo failed 2
fi

12
තාක්‍ෂණිකව නිවැරදි වුවත් (එමඟින් පහත වැටීමක් අවශ්‍ය නොවේ), එය බාෂ්ගේ මෝඩකම භාවිතා නොකරයි if. මම කැමතියි කීත් තොම්සන්ගේ පිළිතුරට.
janmoesen

19
මෙම මෝඩකමට වාසි ඇත - එය ප්‍රතිලාභ අගය ආරක්ෂා කරයි. සියල්ලට ම, මෙය වඩාත් වාචික වුවත් වඩා බලවත් බව මට පෙනේ. එය කියවීම ද පහසු ය.
කුලී රථ

3
"Bash's if idiom" යනු කුමක්ද?
Nowaker

5
OwNowaker මෙය සිදු කිරීම එකම අරමුණයි if. Bash හි ප්‍රවාහ පාලන තත්වයන් සියල්ලම $?තිරය ​​පිටුපස පරීක්ෂා කරයි; ඔවුන් කරන්නේ එයයි. බොහෝ අවස්ථාවන්හීදී එහි වටිනාකම පැහැදිලිව විමසා බැලීම අනවශ්‍ය විය යුතු අතර එය සාමාන්‍යයෙන් ආරම්භක ප්‍රතිවිරෝධකයකි.
ත්‍රිත්ව

1
ununakid ඔබ පිටවීමේ කේතය ගැන තැකීමක් නොකරන්නේ නම් if ! cmdහොඳයි. එසේ නොමැති නම්, පොදු විධිවිධානයක් වන්නේ elseවගන්තියක් භාවිතා කිරීමයි . ඔබට හිස් එකක් තිබිය නොහැක, thenනමුත් සමහර විට විවෘත කිරීම වැදගත් නොවන then : nothing; elseතැන ඔබ දකිනු :ඇත. trueඑතනත් වැඩ කරයි.
ත්‍රිත්ව

52

මෙය මට ප්‍රයෝජනවත් විය:

command && echo "OK" || echo "NOK"

එය commandසාර්ථක වුවහොත්, echo "OK"ක්‍රියාත්මක කරනු ලැබේ, එය සාර්ථක බැවින්, ක්‍රියාත්මක කිරීම එතැනින් නතර වේ. එසේ නොමැති &&නම් මඟ හැරී echo "NOK"ක්‍රියාත්මක කරනු ලැබේ.


5
ඔබට එය අසමත් වුවහොත් යමක් කිරීමට අවශ්‍ය නම් සහ පිටවීමේ කේතය ආරක්ෂා කර ගන්න (විධාන විමසුමේ පෙන්වීමට හෝ ස්ක්‍රිප්ට් එකක පරීක්ෂා කිරීමට), ඔබට මෙය කළ හැකිය: command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
සෑම් හැස්ලර්

2
@ සෑම්-හැස්ලර්: එසේ නොවිය command && echo "OK" || (c=$?; echo "NOK"; (exit $c))යුතුද?
jrw32982 මොනිකා සඳහා සහය දක්වයි

9
එසේම, echo "OK"command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
කොටසම

@ jrw32982, හොඳයි, මම කලින් ඉදිකිරීම් භාවිතා කර ඇත, නමුත් දෙවැන්න නොවේ.
සෑම් හැස්ලර්

ඇත්ත පිළිතුර අදහස් දැක්වීම්වල ඇත, සියල්ලටම ස්තූතියි!
ජෝෂුවා පින්ටර්

6

අප විසින් පරීක්ෂා කිරීමට අවශ්‍ය විධානය මඟින් ආපසු එන තත්වය සමඟ if...then...fiසහ &&/ ||ආකාරයේ ප්‍රවේශයන් ගනුදෙනු කරන බව සැලකිල්ලට ගත යුතුය (සාර්ථකත්වයේ 0); කෙසේ වෙතත්, විධානය අසමත් වුවහොත් හෝ ආදානය සමඟ කටයුතු කිරීමට නොහැකි නම් සමහර විධානයන් ශුන්‍ය නොවන පිටවීමේ තත්වයක් ලබා නොදේ. මෙයින් අදහස් කරන්නේ සුපුරුදු ifසහ &&/ ||ප්‍රවේශයන් එම විශේෂිත විධානයන් සඳහා ක්‍රියා නොකරන බවයි.

නිදසුනක් ලෙස, ලිනක්ස් ග්නූ fileහි දැනට පවතින ගොනුවක් තර්කයක් ලෙස ලැබුනේ නම් සහ 0 සමඟ පිටවෙයි find.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

එවැනි අවස්ථාවන්හිදී, අපට තත්වය හැසිරවිය හැකි එක් ක්‍රමයක් වන්නේ කියවීම stderr/ stdinපණිවිඩ කියවීම , උදා: fileවිධානය මඟින් ආපසු පැමිණීම හෝ විධානයෙහි ප්‍රතිදානය විග්‍රහ කිරීම find. එම අරමුණු සඳහා caseප්‍රකාශය භාවිතා කළ හැකිය.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

4

මට ඉදිරිපත් කළ හැකි වඩාත්ම දෝෂ සහිත වූයේ:

  • පළමුව, වටිනාකම ලබා ගන්න. ඔබ එවැනි දෙයක් කරයි යැයි සිතමු:

RR=$?

දැන්, මෙම තත්වය පමණක් නොව, ඔබ මුහුණ දිය හැකි අනෙක් අයද සලකා බලන්න:

අර්ථ දක්වා ඇති විචල්‍යය:

$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi

පිළිතුර: ඔව්

$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi

පිළිතුර: නැත

අනිශ්චිත විචල්ය:

$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi

පිළිතුර: නැත

$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi

පිළිතුර: ඔව්

$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi

පිළිතුර: ඔව්

මෙය සියලු ආකාරයේ දෝෂ වළක්වාලයි.

ඔබ බොහෝ සින්ටැක්ස් ගැන දන්නවා ඇති, නමුත් මෙන්න උපදෙස් කිහිපයක්:

  • උපුටා දැක්වීම් භාවිතා කරන්න. මග "blank"විය nothing.
  • විචල්යයන් සඳහා නව නූතන අංකනය වේ ${variable}.
  • ඔබේ අංකයට පෙර සංක්ෂිප්ත ශුන්‍යයක් එකතු කිරීමෙන් "කිසිසේත් අංකයක්" වළක්වා ගන්න.
  • නමුත් රැඳී සිටින්න, බිංදුවක් එකතු කිරීමෙන් අංකය බවට පත්වේ base-8. ඔබට මෙවැනි දෝෂයක් ලැබෙනු ඇත:
    • value too great for base (error token is "08")ඉහත අංක සඳහා 7. එය ක්‍රියාත්මක 10#වන්නේ එවිටය:
    • 10#අංකය වීමට බල කරයි base-10.

1

ඔබට මේක කරන්න පුළුවන්:

if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
  echo "ping response succsess!!!"
fi

9
එය ක්‍රියාත්මක වන නමුත් කැටි ගැසී ඇත. ඔබ පිං ධාවනය කරන්නේ උප කුලකයකිනි, එය ප්‍රති .ලයක් ලෙස pingඑය ග්‍රහණය කරගන්නේ එය විධානයක් ලෙස ක්‍රියාත්මක කිරීමෙනි. නමුත් ප්‍රතිදානය / dev / null වෙත හරවා යවන බැවින් එය සැමවිටම හිස් නූල වනු ඇත. එබැවින් ඔබ කිසිවක් උප කුලකයක ධාවනය නොකරයි, එයින් අදහස් කරන්නේ පෙර පිටවීමේ තත්වය (විධාන ආදේශන උප-ෂෙල්, එනම් පිං) රඳවා ගනු ඇති බවයි. නිසැකවම, නිවැරදි මාර්ගය if ping ...; thenමෙහි ඇත.
ස්ටෙෆාන් චසෙලාස්

1

මෙම ත්‍රෙඩ් එකේ වෙනත් තැනක සඳහන් කර ඇති පරිදි, මුල් ප්‍රශ්නය මූලිකවම පිළිතුරු සපයයි. ifකොන්දේසි ද කූඩු කළ හැකි බව පෙන්වන නිදර්ශනයක් මෙන්න .

ifගොනුවක් තිබේද සහ එය සාමාන්‍ය ගොනුවක්ද යන්න පරීක්ෂා කිරීමට මෙම උදාහරණය භාවිතා කරයි . එම කොන්දේසි සත්‍ය නම්, එහි ප්‍රමාණය 0 ට වඩා විශාලද නැද්ද යන්න පරීක්ෂා කරන්න.

#!/bin/bash

echo "Which error log are you checking today? "
read answer

if [ -f /opt/logs/$answer*.errors ]
    then
        if [ -s /opt/logs/$answer*.errors ]
            then
                echo "Content is present in the $answer error log file."
            else
                echo "No errors are present in the $answer error log file."
        fi
    else
        echo "$answer does not have an error log at this time."
fi

2
ඔබේ පිළිතුර එයයි, නමුත් ඔබේ පිළිතුර ප්‍රශ්නයට ආමන්ත්‍රණය නොකරයි.
ජෙෆ් ෂලර්

E ජෙෆ්ෂලර්, ඔබේ සටහනට ස්තූතියි. ප්‍රශ්නයට යොමු කිරීමක් ඇතුළත් කිරීම සඳහා මම මගේ ලිපිය සංස්කරණය කළෙමි.
quartzinquartz

1
#!/bin/bash

if command-1 ; then
   echo "command-1 succeeded and now running from this block command-2"
   command-2
else
   echo "command-1 failed and now running from this block command-3"
   command-3
fi

3
මෙය දැනට පවතින පිළිගත් පිළිතුරට සමාන ය ; කරුණාකර ඔබ නැවත භාවිතා කරන වැඩ ආරෝපණය කරන්න, නැතහොත් ඔබේ පිළිතුරට ඔබේම උත්සාහයක් එක් කරන්න.
ජෙෆ් ෂලර්

-3

$?අවසන් වරට ක්‍රියාත්මක කරන ලද විධානයෙහි තත්වය ඔබට ලබා දෙන පරිදි මෙය සරලව කළ හැකිය .

එබැවින් එය විය හැකිය

#!/bin/sh

... some command ...

if [ $? == 0 ] ; then
  echo '<the output message you want to display>'
else 
  echo '<failure message>'
fi

1
ඩවුන්වෝට්: මෙය සරලවම පෙර පිළිතුරක් වන අතර එය ඒකාකාරී නොවන බවට විවේචන ලැබී ඇත.
ත්‍රිත්ව
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.