විධානයක් සාර්ථක දැයි පරීක්ෂා කරන්නේ කෙසේද?


267

විධානයක් ක්‍රියාත්මක කිරීමේදී දෝෂයක් තිබේදැයි පරීක්ෂා කිරීමට ක්‍රමයක් තිබේද?

උදාහරණයක් :

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

මම දැනටමත් එය කිරීමට උත්සාහ කර ඇති නමුත් එය ක්‍රියාත්මක නොවන බව පෙනේ. මම කොහොමද ඒක කරන්නේ.


9
ඔබට එය කැදැල්ලට දැමිය හැකි නිසාත්, අපෝස්තලාපයන්ගෙන් වෙන්කර හඳුනා ගැනීම පහසු නිසාත්, ෆූ ෆැක්ට වඩා $ ( ෆූ ) කැමති වන්න .
පරිශීලක නොදන්නා

1
BTW, ඔබ ශ්‍රිතයක් ( valid) ඇමතීමට පෙර එය අර්ථ දැක්විය යුතුය.
wjandrea

Answers:


392

ප්‍රතිලාභ අගය ගබඩා කර ඇත $?. 0 සාර්ථකත්වය පෙන්නුම් කරයි, අනෙක් අය දෝෂය දක්වයි.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

වෙනත් ඕනෑම පා value මය වටිනාකමක් මෙන්, අනාගත සංසන්දනය සඳහා ඔබට එය විචල්‍යයක ගබඩා කළ හැකිය:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

හැකි සංසන්දනාත්මක ක්‍රියාකරුවන් සඳහා, බලන්න man test.


ඒක හොඳයි ... මට ප්‍රතිදාන දෝෂය රඳවා ගත හැකිද ?? !! , මේ අවස්ථාවේ දී මට දෝෂ 2 ක් ඇත: විධාන දෝෂය "පෙළ" ex, ගොනුව හමු නොවූ අතර මගේ දෝෂය "පෙළ" මෙම අවස්ථාවේ දී අසමත් විය
moata_u

atoata_u: මගේ පිළිතුරෙහි පෙන්වා ඇති පරිදි ඔබට අගය විචල්‍යයක ගබඩා කළ හැකිය.
ලෙකන්ස්ටයින්

@moata_u: ඔබ ඊට ;පෙර තැබිය යුතු elseඅතර fi: `if ...; එවිට ...; වෙනත් ...; fi
Lekensteyn


2
La බ්ලවුහර්න් [ $? ](හෝ ඒ හා සමානව test $?) ක්‍රියා $?නොකරන්නේ ශුන්‍ය නොවන අංකයකට (0, 1, ආදිය) තක්සේරු කරන බැවිනි . මේ සඳහා ලියකියවිලිtest බලන්න : "ප්‍රකාශනය මඟ හැරී ඇත්නම්, 'පරීක්ෂණය' වැරදියි. ප්‍රකාශනය තනි තර්කයක් නම්, තර්කය ශුන්‍ය වන අතර වෙනත් ආකාරයකින් සත්‍ය නම් 'පරීක්ෂණය' අසත්‍ය වේ."
ලෙකන්ස්ටයින්

93

ඔබට දැන ගැනීමට අවශ්‍ය වන්නේ විධානය සාර්ථක වී හෝ අසාර්ථක වී ඇත්ද යන්න පරීක්ෂා කිරීමට කරදර නොවන්න $?, විධානය කෙලින්ම පරීක්ෂා කරන්න. උදා:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

ප්‍රතිදානය විචල්‍යයකට පැවරීමෙන් ප්‍රතිලාභ අගය වෙනස් නොවේ (හොඳයි, stdout ඇත්ත වශයෙන්ම පර්යන්තයක් නොවන විට එය වෙනස් ලෙස හැසිරෙන්නේ නැත්නම්).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionalsif වඩාත් විස්තරාත්මකව පැහැදිලි කරයි .


බූලියන් අසමත් ද නැද්ද යන්න .ini තුළට ගබඩා කිරීම වැනි අතු බෙදීම හැර වෙනත් දෙයක් කිරීමට ඔබට අවශ්‍ය නම් කුමක් කළ යුතුද? එවිට ඔබේ ප්‍රතිදාන විචල්‍යය එය නොකරයි, නමුත් $?එසේ කරයි, එබැවින් විධානය කෙලින්ම පරීක්ෂා කිරීම වඩා හොඳ යැයි ඔබ පැවසීම වැරදිය.
තිමෝති හංස

විචල්ය ප්රතිදාන පැවරීම නැවත අගය එක් භාවිතා කරන විට වෙනස් විය හැක localඅණ, එනම් local foo=$(false); echo $?;නිෂ්පාදනය 0ප්රතිදානය මත. නමුත් localඅදාළ වන්නේ බැෂ් ශ්‍රිත ඇතුළත පමණි.
ක්‍රොමැක්ස්

32
command && echo OK || echo Failed

commandතිරය ​​මත දෝෂයක් ඇති වුවහොත් එය සඟවන්නේ කෙසේද?
සිගූර්

නම් commandමෙසේ ලියයි දෝෂ stderr වෙත, ඔබ එම ආකෘති පත්රය භාවිතා කළ හැක command 2> /dev/null && echo OK || echo Failed. මෙම 2> /dev/nullයළි-යොමුකරයි කිරීමට ප්රතිදානය stderr /dev/null. කෙසේ වෙතත්, සමහර උපයෝගිතා stdout වෙත දෝෂ ලියනු ඇත (මෙය නරක පුරුද්දක් වුවද). මෙම අවස්ථාවේදී ඔබට නැවත හරවා යැවීමෙන් 2 මඟ හැරිය හැක, නමුත් ඔබට විධානයෙන් ඕනෑම ප්‍රතිදානයක් අහිමි වනු ඇත. සාර්ථකත්වය පරීක්ෂා කිරීමේ මෙම ක්‍රමය සරල තෘතීය තර්කනය සඳහා හොඳ නමුත් වඩාත් සංකීර්ණ හැසිරීම් $?සඳහා විධාන සාර්ථකත්වය පරීක්ෂා කිරීම වඩාත් සුදුසුය , නැතහොත් if@ ගීර්හාගේ පිළිතුරෙහි දක්වා ඇති වාරණ ක්‍රමය භාවිතා කරන්න .
ශ්‍රේෂ් est තම බෙන්ඩර්

මෙය සෑම අවස්ථාවකම සුරැකෙන්නේ නැති බව සලකන්න. බලන්න: github.com/koalaman/shellcheck/wiki/SC2015
ටොබියාස්

20

$? පෙර විධානයෙහි පිටවීමේ තත්වය අඩංගු විය යුතු අතර එය කිසිදු දෝෂයක් සඳහා ශුන්‍ය විය යුතුය.

ඉතින්, වැනි දෙයක්;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

බොහෝ අවස්ථාවන්හීදී, එකිනෙකා මත යැපීමට අවශ්‍ය දාම විධාන සඳහා && ඉදිකිරීම් භාවිතා කිරීම පහසුය. ඒ නිසා cd /nonexistant && echo success!බව නොවේ && පෙර අණ විරාම නිසා සාර්ථකත්වය දෝංකාර දෙනවා. මේ වන නිගමනයකි || කොහේ cd /nonexistant || echo fail ඇත අසමත් cd අසමත් නිසා දෝංකාර දෙනවා. (ඔබ || පිටවීම වැනි දෙයක් භාවිතා කරන්නේ නම් මෙය ප්‍රයෝජනවත් වේ, එය පෙර විධානය අසමත් වුවහොත් ස්ක්‍රිප්ට් එක අවසන් වේ.)


ඒක හොඳයි ... මට ප්‍රතිදාන දෝෂය රඳවා ගත හැකිද ?? !! , මේ අවස්ථාවේ දී මට දෝෂ 2 ක් ඇත: විධාන දෝෂය "පෙළ" ex, ගොනුව හමු නොවූ අතර මගේ දෝෂය "පෙළ" මෙම අවස්ථාවේ දී අසමත් විය
moata_u

@moata_u, බලන්න mywiki.wooledge.org/BashFAQ/002
geirha

5
command && echo $? || echo $?

ඔබ අදහස් කළේ command; echo $??
ජේවියර් බුසි

නැත, මගේ රේඛාව නිවැරදි ය, එය සාර්ථක හෝ අසාර්ථක වුව ද එය සත්‍ය ප්‍රති result ල කේතය අංකයක් ලෙස ලබා දෙයි.
modrobert

1
හරි, කරුණාකර මේවායේ වෙනස්කම් මට පැහැදිලි කරන්න: true && echo $? || echo $?/ true; echo $?සහ false && echo $? || echo $?/ false; echo $?- ඔබ සොයාගනු ඇත, ඔවුන් හරියටම කරන්නේ එකම දෙයයි: D
ජේවියර් බුසි

ඔව්, එකම ප්‍රති result ලය නමුත් කොන්දේසියකින් තොරව. ඇසූ මුල් ප්‍රශ්නය වූයේ "විධානයක් සාර්ථක දැයි පරීක්ෂා කරන්නේ කෙසේද?", මෙය පදනම් වූයේ පෙර පිළිතුරු මත ය. මම හිතන්නේ ඊට වඩා හොඳ උදාහරණයක් වනු ඇත:command && echo "success: $?" || echo "fail: $?"
modrobert

5

අප විසින් පරීක්ෂා කිරීමට අවශ්‍ය විධානය මඟින් ආපසු එන තත්වය සමඟ 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

(මෙය unix.stackexchange.com හි අදාළ ප්‍රශ්නය පිළිබඳ මගේම පිළිතුරේ නැවත සටහනකි )


2

වෙනත් බොහෝ පිළිතුරු වල සඳහන් කර ඇති පරිදි, $?කැමැත්ත පිළිබඳ සරල පරීක්ෂණයක් මේ ආකාරයෙන් කරනු ඇත

if [ $? -eq 0 ]; then something; fi

විධානය අසමත් දැයි පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නම් , ඔබට bashපහත දැක්වෙන පරිදි කෙටි අනුවාදයක් භාවිතා කළ හැකිය (නමුත් සමහර විට අතිරික්තය):

if (($?)); then something; fi

මෙය ක්‍රියාත්මක වන්නේ (( ))ගණිත ප්‍රකාරය භාවිතා කිරීමෙනි , එබැවින් විධානය ආපසු ලැබුනේ නම් success, එනම් $? = 0පරීක්ෂණය ((0))කුමන පරීක්ෂණ සඳහාද යන්න තක්සේරු කරයි , එසේ නොමැතිනම් falseඑය නැවත පැමිණේ true.

සාර්ථකත්වය පරීක්ෂා කිරීම සඳහා , ඔබට මෙය භාවිතා කළ හැකිය:

if ! (($?)); then something; fi

නමුත් එය දැනටමත් පළමු උදාහරණයට වඩා කෙටි නොවේ.


1
විවේචනාත්මක?
මොනිකා

1

ඔබගේ විධාන සනාථ කිරීමේ දෝෂ සඳහා :

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

කෙට්ටු නිෂ්පාදනයේ ආනුභාවයෙන් :

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.