මම මේ වගේ දෙයක් කඩිනමින් කරන්නේ කෙසේද?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
මම මේ වගේ දෙයක් කඩිනමින් කරන්නේ කෙසේද?
if "`command` returns any error";
then
echo "Returned an error"
else
echo "Proceed..."
fi
Answers:
විධානයක් සාර්ථක හෝ අසමත් වුවහොත් කොන්දේසි සහිතව යමක් කරන්නේ කෙසේද?
බාෂ්ගේ if
ප්රකාශය කරන්නේ එයයි :
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
අදහස් වලින් තොරතුරු එකතු කිරීම: මෙම අවස්ථාවේදී ... සින්ටැක්ස් භාවිතා කිරීමට ඔබට අවශ්ය නැත . එයම බොහෝ දුරට සමාන විධානයකි . එය බොහෝ විට භාවිතා කළ හැකි වඩාත් පොදු විධානය වන අතර , එය කවචයේ වාක්ය ඛණ්ඩයේ කොටසක් යැයි උපකල්පනය කළ හැකිය. නමුත් විධානයක් සාර්ථකද නැද්ද යන්න පරීක්ෂා කිරීමට ඔබට අවශ්ය නම් , ඉහත පෙන්වා ඇති පරිදි විධානය සෘජුවම භාවිතා කරන්න .[
]
[
test
if
if
then
වෙනම රේඛාවක් දැමිය හැකිය .
if ! command ; then ... ; fi
. [
එයම විධානයක් වන අතර එය මේ අවස්ථාවේ දී අවශ්ය නොවේ.
ෂෙල් විධානයක් ක්රියාත්මක වන්නේ නම් ඔබට සිදුවීමට අවශ්ය කුඩා දේවල් සඳහා, ඔබට &&
ඉදිකිරීම් භාවිතා කළ හැකිය :
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 ාන දෙයක් විය හැකි නමුත් ඇතැම් විට ඒවාට පාලනයේ ප්රවාහය වඩාත් පැහැදිලි කළ හැකිය.
$?
නවතම විධානය / ශ්රිතය ක්රියාත්මක කිරීමේ ප්රති 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
if
. මම කැමතියි කීත් තොම්සන්ගේ පිළිතුරට.
if
. Bash හි ප්රවාහ පාලන තත්වයන් සියල්ලම $?
තිරය පිටුපස පරීක්ෂා කරයි; ඔවුන් කරන්නේ එයයි. බොහෝ අවස්ථාවන්හීදී එහි වටිනාකම පැහැදිලිව විමසා බැලීම අනවශ්ය විය යුතු අතර එය සාමාන්යයෙන් ආරම්භක ප්රතිවිරෝධකයකි.
if ! cmd
හොඳයි. එසේ නොමැති නම්, පොදු විධිවිධානයක් වන්නේ else
වගන්තියක් භාවිතා කිරීමයි . ඔබට හිස් එකක් තිබිය නොහැක, then
නමුත් සමහර විට විවෘත කිරීම වැදගත් නොවන then : nothing; else
තැන ඔබ දකිනු :
ඇත. true
එතනත් වැඩ කරයි.
මෙය මට ප්රයෝජනවත් විය:
command && echo "OK" || echo "NOK"
එය command
සාර්ථක වුවහොත්, echo "OK"
ක්රියාත්මක කරනු ලැබේ, එය සාර්ථක බැවින්, ක්රියාත්මක කිරීම එතැනින් නතර වේ. එසේ නොමැති &&
නම් මඟ හැරී echo "NOK"
ක්රියාත්මක කරනු ලැබේ.
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
යුතුද?
echo "OK"
command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
අප විසින් පරීක්ෂා කිරීමට අවශ්ය විධානය මඟින් ආපසු එන තත්වය සමඟ 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
මට ඉදිරිපත් කළ හැකි වඩාත්ම දෝෂ සහිත වූයේ:
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
.ඔබට මේක කරන්න පුළුවන්:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
ping
එය ග්රහණය කරගන්නේ එය විධානයක් ලෙස ක්රියාත්මක කිරීමෙනි. නමුත් ප්රතිදානය / dev / null වෙත හරවා යවන බැවින් එය සැමවිටම හිස් නූල වනු ඇත. එබැවින් ඔබ කිසිවක් උප කුලකයක ධාවනය නොකරයි, එයින් අදහස් කරන්නේ පෙර පිටවීමේ තත්වය (විධාන ආදේශන උප-ෂෙල්, එනම් පිං) රඳවා ගනු ඇති බවයි. නිසැකවම, නිවැරදි මාර්ගය if ping ...; then
මෙහි ඇත.
මෙම ත්රෙඩ් එකේ වෙනත් තැනක සඳහන් කර ඇති පරිදි, මුල් ප්රශ්නය මූලිකවම පිළිතුරු සපයයි. 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
#!/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
$?
අවසන් වරට ක්රියාත්මක කරන ලද විධානයෙහි තත්වය ඔබට ලබා දෙන පරිදි මෙය සරලව කළ හැකිය .
එබැවින් එය විය හැකිය
#!/bin/sh
... some command ...
if [ $? == 0 ] ; then
echo '<the output message you want to display>'
else
echo '<failure message>'
fi