Bash buildin trueගැන සහ වඩාත් නිශ්චිතවම, Bash වරහන් තුළ ප්රකාශන පුළුල් කිරීම සහ අර්ථ නිරූපණය කරන්නේ කෙසේද යන්න පිළිබඳව මෙහි යම් වැරදි වැටහීමක් ඇති බව පෙනේ .
දී කේතය miku පිළිතුර එම බෑෂ් builtin සමග කරන්න දෙයක් නැති බවයි true, හෝ /bin/true, හෝ වෙනත් කිසිම රසයක් trueවිධාන. මෙම අවස්ථාවෙහිදී, trueසරල අක්ෂර මාලාවකට වඩා වැඩි දෙයක් trueනොවන අතර, විචල්ය පැවරුමෙන් හෝ කොන්දේසි සහිත ප්රකාශනය ඇගයීමෙන් හෝ කිසි විටෙකත් විධානය / බිල්ඩින් වෙත ඇමතුමක් ලබා නොදේ.
පහත කේතය මිකුගේ පිළිතුරේ කේතයට ක්රියාකාරීව සමාන වේ:
the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
echo 'Be careful not to fall off!'
fi
මෙහි ඇති එකම වෙනස නම්, සසඳන විට අක්ෂර හතර 'y', 'e', 'a' සහ 'h' වෙනුවට 't', 'r', 'u' සහ 'e' ය. ඒක තමයි. විධානයක් හෝ බිල්ඩින් නම් කිරීමට කිසිදු උත්සාහයක් ගෙන නොමැත yeah, (මිකුගේ උදාහරණයේ) බාෂ් ටෝකනය විග්රහ කරන විට කිසිදු ආකාරයක විශේෂ හැසිරවීමක් සිදු නොවේ true. එය නූලක් පමණක් වන අතර එය සම්පූර්ණයෙන්ම අත්තනෝමතික ය.
යාවත්කාලීන කිරීම (2014-02-19): මිකුගේ පිළිතුරෙහි ඇති සබැඳිය අනුගමනය කිරීමෙන් පසුව, දැන් සමහර ව්යාකූලතා පැමිණෙන්නේ කොතැනින්දැයි මට පෙනේ. මිකුගේ පිළිතුර තනි වරහන් භාවිතා කරයි, නමුත් ඔහු සම්බන්ධ කරන කේත ස්නිපටය වරහන් භාවිතා නොකරයි. එය යන්තම්:
the_world_is_flat=true
if $the_world_is_flat; then
echo 'Be careful not to fall off!'
fi
කේත ස්නිපෙට් දෙකම එකම ආකාරයකින් හැසිරෙනු ඇත, නමුත් වරහන් වර්ගය යටතේ සිදුවන දේ සම්පූර්ණයෙන්ම වෙනස් කරයි.
සෑම අවස්ථාවකම බාෂ් කරන්නේ කුමක්ද යන්න මෙන්න:
වරහන් නොමැත:
- විචල්ය පුළුල්
$the_world_is_flatවැල කිරීමට "true".
"true"විධානයක් ලෙස නූල විග්රහ කිරීමට උත්සාහ කිරීම .
trueවිධානය සොයාගෙන ක්රියාත්මක කරන්න (එක්කෝ බිල්ඩින් හෝ /bin/true, බාෂ් අනුවාදය අනුව).
trueවිධානයෙහි පිටවීමේ කේතය (සෑම විටම 0) සමඟ සසඳන්න . බොහෝ කවච වල 0 හි පිටවීමේ කේතය සාර්ථකත්වය පෙන්නුම් කරන අතර වෙනත් ඕනෑම දෙයක් අසාර්ථක බව පෙන්නුම් කරයි.
- පිටවීමේ කේතය 0 (සාර්ථක) බැවින්,
ifප්රකාශයේ thenවගන්තිය ක්රියාත්මක කරන්න
වරහන්:
- විචල්ය පුළුල්
$the_world_is_flatවැල කිරීමට "true".
- දැන් සම්පුර්ණයෙන්ම පුළුල් වී ඇති කොන්දේසි සහිත ප්රකාශනය විග්රහ කරන්න
string1 = string2. මෙම =ක්රියාකරු bash ගේ වේ string සංසන්දනය ක්රියාකරු. නිසා...
"true"සහ අතර සංසන්දනයක් කරන්න "true".
- ඔව්, නූල් දෙක එක හා සමානයි, එබැවින් කොන්දේසිගත වටිනාකම සත්ය වේ.
ifප්රකාශයේ thenවගන්තිය ක්රියාත්මක කරන්න .
වරහන් රහිත කේතය ක්රියා කරයි, මන්ද trueවිධානය මඟින් පිටවීමේ කේතයක් 0 ලබා දෙන අතර එය සාර්ථකත්වය පෙන්නුම් කරයි. වරහන් කේතය ක්රියා කරයි, මන්ද යත් එහි අගය දකුණු පස ඇති $the_world_is_flatවචනාර්ථයට සමාන වන බැවිනි .true=
කාරණය ගෙදර ගෙනයාමට, පහත දැක්වෙන කේත කොටස් දෙක සලකා බලන්න:
මෙම කේතය (මූල වරප්රසාද සමඟ ක්රියාත්මක වන්නේ නම්) ඔබේ පරිගණකය නැවත ආරම්භ කරනු ඇත:
var=reboot
if $var; then
echo 'Muahahaha! You are going down!'
fi
මෙම කේතය මුද්රණය කරන්නේ "හොඳයි උත්සාහ කරන්න" යනුවෙනි. නැවත පණගැන්වීමේ විධානය කැඳවනු නොලැබේ.
var=reboot
if [ $var ]; then
echo 'Nice try.'
fi
යාවත්කාලීන කිරීම (2014-04-14)= සහ ==: AFAIK අතර ඇති වෙනස පිළිබඳ අදහස් දැක්වීමේ ප්රශ්නයට පිළිතුරු සැපයීම සඳහා කිසිදු වෙනසක් නොමැත. මෙම ==ක්රියාකරු සඳහා බෑෂ්-විශේෂිත පර්යාය පදයක් වන =අතර, ඈත මම දැකලා තියෙනවා ලෙස, ඔවුන් සියලු සන්දර්භයන් තුළ හරියටම එම වැඩ.
කෙසේ වෙතත්, මම විශේෂයෙන් කතා කරන්නේ එක්කෝ හෝ පරීක්ෂණ වලදී භාවිතා කරන =සහ ==නූල් සංසන්දනය කිරීමේ ක්රියාකරුවන් ගැන ය . මම එය යෝජනා නොකරන අතර සෑම තැනකම හුවමාරු කර ගත හැකිය.[ ][[ ]]===
උදාහරණයක් ලෙස, ඔබට පැහැදිලිවම විචල්ය පැවරුම් කළ නොහැක ==, වැනි var=="foo"(තාක්ෂණිකව ඔබට මෙය කළ හැකිය , නමුත් එහි වටිනාකම varවනුයේ "=foo", බාෂ් ==මෙහි ක්රියාකරුවෙකු නොදකින නිසා , එය =(පැවරුම්) ක්රියාකරුවෙකු දකින අතර , පසුව වචනයේ පරිසමාප්ත අර්ථයෙන්ම ="foo"එය බවට පත්වේ "=foo").
එසේම, නමුත් =සහ ==එකිනෙකට හුවමාරු වන අතර, ඔබ මතක එම පරීක්ෂණ කටයුතු ආකාරය කරන බව අවධාරණය කළ යුතුය කරන්නේ ඔබ තුළ එය භාවිතා කරන්නේ ද යන්න මත රඳා පවතී [ ]හෝ [[ ]], සහ ද operands උපුටා ඇත නැද්ද යන්න මත. උසස් බාෂ් ස්ක්රිප්ටින් මාර්ගෝපදේශය තුළ ඔබට ඒ ගැන වැඩිදුර කියවිය හැකිය : 7.3 වෙනත් සංසන්දනාත්මක ක්රියාකරුවන් ( =සහ සාකච්ඡාවට පහළට අනුචලනය කරන්න ==).
ifප්රකාශය මඟින් විචල්යයේ අන්තර්ගතය ක්රියාත්මක කරනුයේ බාෂ් බිල්ඩින් යtrue. ඕනෑම විධානයක් විචල්යයේ අගය ලෙස සැකසිය හැකි අතර එහි පිටවීමේ අගය ඇගයීමට ලක් කෙරේ.