Bash ක්‍රියාකරුවන් [[vs [vs (vs) ((?) අතර ඇති වෙනස කුමක්ද?


303

බෑෂ් (වරහන්, ද්විත්ව වරහන්, වරහන් සහ ද්විත්ව වරහන්) භාවිතා කරන විට මෙම ක්‍රියාකරුවන් වෙනස් ආකාරයකින් කරන්නේ කුමක්ද යන්න පිළිබඳව මම ටිකක් ව්‍යාකූල වී සිටිමි.

[[ , [ , ( , ((

මෙවැනි ප්‍රකාශ නම් මිනිසුන් ඒවා භාවිතා කරන බව මම දැක ඇත්තෙමි.

if [[condition]]

if [condition]

if ((condition))

if (condition)


43
වරහන් සහ වරහන් ප්‍රලේඛනය තුළ සෙවීම එතරම් පහසු නොවන අතර, එම අංගයන්ගේ නම් ඔබ නොදන්නේ නම් ඔබට ඇත්තේ එපමණකි.
ilkkachu

Answers:


324

ifප්රකාශය සාමාන්යයෙන් වගේ

if commands1
then
   commands2
else
   commands3
fi

මෙම thenඉවත් වීමක් කේතය නම් වගන්තිය ක්රියාත්මක වන commands1ශුන්ය වේ. පිටවීමේ කේතය nonzero නම්, එම elseවගන්තිය ක්‍රියාත්මක වේ. commands1සරල හෝ සංකීර්ණ විය හැකිය. නිදසුනක් ලෙස, එය එක් ක්‍රියාකරුවෙකු විසින් වෙන් කරන ලද නල මාර්ග එකක හෝ වැඩි ගණනක අනුක්‍රමයක් විය හැකිය ;,& , &&, හෝ ||. මෙම ifපහත පෙන්වා ඇත කොන්දේසි පමණක් විශේෂ අවස්ථා commands1:

  1. if [ condition ]

    මෙය සාම්ප්‍රදායික ෂෙල් testවිධානයයි. එය සියලුම පොසික්ස් ෂෙල් වෙඩි වලින් ලබා ගත හැකිය. පරීක්ෂණ විධානය පිටවීමේ කේතයක් සකසන අතර ifප්‍රකාශය ඒ අනුව ක්‍රියා කරයි. සාමාන්‍ය පරීක්ෂණ යනු ගොනුවක් තිබේද නැතිනම් එක් අංකයක් තවත් සංඛ්‍යාවකට සමානද යන්නයි.

  2. if [[ condition ]]

    මේ පිළිබඳව නව උසස් විචලනය testසිට ksh බව bash හා zsh ද සහාය දක්වයි. මෙම testවිධානය මඟින් පිටවීමේ කේතයක් ද සකසා ඇති අතර ifප්‍රකාශය ඒ අනුව ක්‍රියා කරයි. එහි දීර් extended කරන ලද විශේෂාංග අතර, නූලක් සාමාන්‍ය ප්‍රකාශනයකට ගැලපේද යන්න පරීක්ෂා කළ හැකිය.

  3. if ((condition))

    තවත් ksh දිගුවකි bash හා zsh සහයෝගය ද. මෙය ගණිතය සිදු කරයි. අංක ගණිතයේ ප්‍රති result ලයක් ලෙස පිටවීමේ කේතයක් සකසා ifප්‍රකාශය ඒ අනුව ක්‍රියා කරයි. අංක ගණිත ගණනය කිරීමේ ප්‍රති result ලය අස්ථිර නම් එය ශුන්‍ය (සත්‍ය) පිටවීමේ කේතයක් ලබා දෙයි. මෙන් [[...]], මෙම පෝරමය POSIX නොවන අතර එම නිසා අතේ ගෙන යා නොහැක.

  4. if (command)

    මෙය විධානය උප අක්ෂරයකින් ක්‍රියාත්මක වේ. විධානය සම්පුර්ණ වූ විට, එය පිටවීමේ කේතයක් සකසන අතර ifප්‍රකාශය ඒ අනුව ක්‍රියා කරයි.

    මෙවැනි උප කුලකයක් භාවිතා කිරීමට සාමාන්‍ය හේතුවක් commandවන්නේ commandඅවශ්‍ය නම් විචල්‍ය පැවරුම් හෝ ෂෙල් පරිසරයට වෙනත් වෙනස්වීම් වල අතුරු ආබාධ සීමා කිරීමයි. උපසිරැසිය අවසන් වූ පසු එවැනි වෙනස්කම් පවතින්නේ නැත.

  5. if command

    විධානය ක්‍රියාත්මක වන අතර ifප්‍රකාශය එහි පිටවීමේ කේතය අනුව ක්‍රියා කරයි.


37
5 වන විකල්පය ඇතුළත් කිරීම ගැන ස්තූතියි. මෙය සැබවින්ම ක්‍රියාත්මක වන ආකාරය හා පුදුම සහගත ලෙස u න උපයෝගී කර ගන්නේ කෙසේද යන්න තේරුම් ගැනීමට එය ප්‍රධාන ය.
පැටවුන්

5
[එය ඇත්ත වශයෙන්ම ද්විමය මිස අභ්‍යන්තර විධානයක් හෝ සංකේතයක් නොවන බව සලකන්න . සාමාන්යයෙන් ජීවත් වේ /bin.
ජූලියන් ආර්.

9
@ ජුලියන් ආර්. ඇත්ත වශයෙන්ම [ගොඩනගා ඇත test. අනුකූලතා හේතූන් මත ද්විමය අනුවාදයන් ඇත. පරීක්ෂා කරන්න help [සහ help test.
ඕල්ඩ් ටයිමර්

4
වටිනා ((isnt POSIX අතර බව සඳහන් $((එනම් අංක ගණිතමය පුළුල් වන අතර, එය ඔවුන් ව්යාකූල කිරීමට පහසුය බොහෝ විට මෙම දුෂ්කරතාවය මගහැර භාවිතා කිරීම වගේ දෙයක් තමයි. [ $((2+2)) -eq 4 ]Conditinal ප්රකාශ අංක ගණිතමය යොදා ගැනීමට
Sergiy Kolodyazhnyy

2
මෙම පිළිතුර එක් වරකට වඩා වැඩි වාර ගණනක් මට ඉදිරිපත් කළ හැකි යැයි මම ප්‍රාර්ථනා කරමි. පරිපූර්ණ පැහැදිලි කිරීම.
ඇන්තනි ගැට්ලින්

87
  • (…)වරහන් අඟවනු උප කබොළ . ඒවායේ ඇති දේ වෙනත් බොහෝ භාෂාවල මෙන් ප්‍රකාශනයක් නොවේ. එය විධාන ලැයිස්තුවකි (පිටත වරහන් වැනි). මෙම විධානයන් වෙනම උප ක්‍රියාවලියකින් ක්‍රියාත්මක වන බැවින් වරහන් තුළ සිදු කෙරෙන ඕනෑම හරවා යැවීම, පැවරීම යනාදිය වරහන් වර්‍ගයෙන් පිටත කිසිදු බලපෑමක් ඇති නොකරයි.
    • ප්රධාන පෙළේ ඩොලර් ලකුණක් සමග, $(…)යනු විධාන ආදේශන : වරහන් තුල විධාන වන අතර, මෙම විධානය සිට එහි ප්රතිදානය (අතිරේක පුළුල් කිරීම් පසු ආදේශ, උද්ධෘත පාඨ අතර වේ නම් මිස, නමුත් එම තියෙන්නේ විධාන රේඛාවේ කොටසක් ලෙස භාවිතා කරයි තවත් කතාවක් ) .
  • { … }වරහන් වරහන් වර්‍ගවලට සමාන වන අතර ඒවා විධාන කාණ්ඩගත කරයි, නමුත් ඒවා බලපාන්නේ විග්‍රහ කිරීමට මිස කණ්ඩායම්කරණයට නොවේ. මෙම වැඩසටහන x=2; { x=4; }; echo $x, මුද්රණය 4 ෙහයින්ද, x=2; (x=4); echo $xමුද්රණ 2. (වීම වගේම ෙබ්ස් ප්රධාන වචන පසු විධානය තත්ත්වය (ඒ අනුව අවකාශය තුළ පිරිසගේ හා සොයා ගත කිරීමට අවශ්ය {හා ;පෙර} වරහන් නැහැ ෙහයින්ද,). යන්තම් කාරක රීති quirk තියෙන්නේ ඒ.)
    • ප්රධාන පෙළේ ඩොලර් ලකුණක් සමග, ${VAR}යනු පරාමිතිය පුළුල් හැකි අමතර පරිවර්තනයන් සමග, විචල්ය අගය කිරීමට පුළුල්. මෙම ksh93ෂෙල් ද සහය ${ cmd;}ඇති උප කබොළ අභිභවනය නොවන බව විධානය ආදේශ ආකෘතිය වශයෙන්.
  • ((…))ද්විත්ව වරහන් මඟින් අංක ගණිතමය උපදෙස් , එනම් පූර්ණ සංඛ්‍යා ගණනය කිරීම, වෙනත් ක්‍රමලේඛන භාෂාවන්ට සමාන වාක්‍ය ඛණ්ඩයක් වටා ඇත . මෙම වාක්‍ය ඛණ්ඩය වැඩිපුරම භාවිතා කරනුයේ පැවරුම් සහ කොන්දේසි සඳහා ය. මෙය පවතින්නේ ksh / bash / zsh හි මිස සරල sh හි නොවේ.
    • ගණිත ප්‍රකාශනවල එකම වාක්‍ය ඛණ්ඩය භාවිතා වන අතර එය ප්‍රකාශනයේ $((…))පූර්ණ අගය දක්වා විහිදේ.
  • [ … ]තනි වරහන් කොන්දේසි සහිත ප්‍රකාශන වටා ඇත. කොන්දේසි සහිත ප්‍රකාශන බොහෝ දුරට ගොඩනඟා ඇත්තේ විචල්‍යයක් හිස් දැයි පරීක්ෂා කිරීම සහ ගොනුවක් තිබේදැයි පරීක්ෂා කිරීම වැනි ක්‍රියාකරුවන් මත ය . ඔබට එක් එක් ක්‍රියාකරු වටා අවකාශයක් අවශ්‍ය බව සලකන්න (උදා: නොවේ ), සහ වරහන් ඇතුළත හා පිටත අවකාශයක් හෝ අක්ෂරයක් (උදා: නැත ).-n "$variable"-e "$file"[ "$x" = "$y" ][ "$x"="$y" ];[ -n "$foo" ][-n "$foo"]
  • [[ … ]]ද්විත්ව වරහන් යනු අතිරේක අංග කිහිපයක් සහිත ksh / bash / zsh හි කොන්දේසි සහිත ප්‍රකාශනවල විකල්ප ආකාරයකි, උදාහරණයක් ලෙස [[ -L $file && -f $file ]]ගොනුවක් සාමාන්‍ය ගොනුවකට සංකේතාත්මක සම්බන්ධකයක් දැයි පරීක්ෂා කිරීමට ඔබට ලිවිය හැකිය [ -L "$file" ] && [ -f "$file" ]. උපුටා දැක්වීම් නොමැතිව අවකාශයන් සමඟ පරාමිති ප්‍රසාරණය ද්විත්ව වරහන් තුළ ක්‍රියා කරන්නේ මන්දැයි බලන්න [[නමුත් තනි වරහන් නොවේ [? මෙම මාතෘකාව පිළිබඳ වැඩි විස්තර සඳහා.

කවචයේ, සෑම විධානයකටම කොන්දේසි සහිත විධානයක් ඇත: සෑම විධානයකටම නැවත පැමිණීමේ තත්වයක් ඇති අතර එය සාර්ථකත්වය හෝ 1 සහ 255 අතර පූර්ණ සංඛ්‍යාවක් (සහ සමහර කවච වල වැඩි විය හැක) අසමත් වීම පෙන්නුම් කරයි. මෙම [ … ]විධානය (හෝ [[ … ]]කාරක රීති ආකෘති පත්රය) ද අක්ෂර වින්යාස සහිතව කරන හැක යම් විධානයක් යනු test …හා ගොනුව පවතී විට සාර්ථක හෝ වැලක්, හිස්-නොවන විට, හෝ අංකය තවත් වඩා කුඩා වන විට, ආදිය සඳහා ((…))කාරක රීති ආකාරයක විට අංකය සාර්ථක nonzero වේ. ෂෙල් ස්ක්‍රිප්ට් එකක කොන්දේසි පිළිබඳ උදාහරණ කිහිපයක් මෙන්න:

  • නූල myfileඅඩංගු දැයි පරීක්ෂා කරන්න hello:

    if grep -q hello myfile; then 
  • නම් mydirනාමාවලියකි, එය වෙනස් සහ දේවල් කරන්න:

    if cd mydir; then
      echo "Creating mydir/myfile"
      echo 'some content' >myfile
    else
      echo >&2 "Fatal error. This script requires mydir to exist."
    fi
  • myfileවත්මන් නාමාවලියෙහි ගොනුවක් තිබේදැයි පරීක්ෂා කරන්න :

    if [ -e myfile ]; then 
  • එකම, නමුත් අනතුරුදායක සංකේතාත්මක සබැඳි ද ඇතුළුව:

    if [ -e myfile ] || [ -L myfile ]; then 
  • x(සංඛ්‍යාත්මක යැයි උපකල්පනය කර ඇති) අගය අවම වශයෙන් 2 ක් දැයි පරීක්ෂා කරන්න .

    if [ "$x" -ge 2 ]; then 
  • ටෙස්ට් වටිනාකම නම් x(සංඛ්යාත්මක ලෙස උපකල්පනය කර ඇති) bash / ksh / zsh දී, අඩු වශයෙන් 2 වේ:

    if ((x >= 2)); then 

තනි වරහන සහය දැක්වීම සටහන -aවෙනුවට &&එක් ලියන්න පුළුවන් ඒ නිසා,: [ -L $file -a -f $file ], අමතර තොරව වරහන් තුළ චරිත සංඛ්යාව සමාන වන [අතර ]...
ඇලෙක්සිස් Wilke

6
Lex ඇලෙක්සිස්විල්කේ ක්‍රියාකරුවන් වන -aඅතර -oගැටළු සහගත වන්නේ ඒවා සම්බන්ධ සමහර ක්‍රියාකරුවන් ක්‍රියාකරුවන් මෙන් පෙනේ නම් වැරදි විග්‍රහයන්ට තුඩු දිය හැකි බැවිනි. ඒ නිසා මම ඒවා සඳහන් නොකරමි: ඔවුන්ට ශුන්‍ය වාසියක් ඇති අතර සෑම විටම ක්‍රියා නොකරයි. හොඳ හේතුවක් නොමැතිව කිසි විටෙකත් නොකියවූ විචල්‍ය ප්‍රසාරණයන් ලියන්න: [[ -L $file -a -f $file ]]හොඳයි, නමුත් ඔබට අවශ්‍ය තනි වරහන් සමඟ [ -L "$file" -a -f "$file" ](එය $fileසෑම විටම ආරම්භ වන්නේ නම් /හෝ හරි ./).
ගිලෙස්ගේ SO- නපුරු වීම නවත්වන්න '

එය [[ -L $file && -f $file ]]( ප්‍රභේදය -aසමඟ නැත [[...]]) බව සලකන්න .
ස්ටෙෆාන් චසෙලාස්

20

සිට bash ප්රලේඛනය :

(list)ලැයිස්තුව ක්‍රියාත්මක වන්නේ උප පරිසරයක ය (පහත COMMAND EXECUTION ENVIRONMENT බලන්න). විධාන සම්පූර්ණ වූ පසු ෂෙල් පරිසරයට බලපාන විචල්‍ය පැවරුම් සහ බිල්ඩින් විධාන ක්‍රියාත්මක නොවේ. ආපසු පැමිණීමේ තත්වය යනු ලැයිස්තුවේ පිටවීමේ තත්වයයි.

වෙනත් වචන වලින් කිවහොත්, 'ලැයිස්තුවේ' (අ වැනි cd) සිදු වන ඕනෑම දෙයක් (සහ ඉන් පිටත කිසිදු බලපෑමක් ඇති නොවන බවට ඔබ වග බලා ගන්න ). කාන්දු වන බව එකම දේ අවසාන විධානය පිළිබඳ පිටවීම් කේතය හෝ සමඟ set -eදෝෂයක් ලෙස (කිහිපයක් හැර වෙනත් ජනනය කරන ලද පළමු විධානය if, whileආදිය,)

((expression))ARITHMETIC EVALUATION යටතේ පහත විස්තර කර ඇති නීතිරීති අනුව ප්‍රකාශනය ඇගයීමට ලක් කෙරේ. ප්‍රකාශනයේ අගය ශුන්‍ය නොවේ නම්, ප්‍රතිලාභ තත්ත්වය 0; නැතහොත් ආපසු පැමිණීමේ තත්වය 1 වේ. මෙය හරියටම "ප්‍රකාශනයට" ඉඩ දීමට සමාන වේ.

මෙය ගණිතය කිරීමට ඔබට ඉඩ සලසන bash දිගුවකි. මෙය exprසියලු සීමාවන් නොමැතිව භාවිතා කිරීමට තරමක් සමාන වේ expr(සෑම තැනකම අවකාශ තිබීම, පැන යාම *ආදිය)

[[ expression ]]කොන්දේසි සහිත ප්‍රකාශන ප්‍රකාශනය ඇගයීම මත පදනම්ව 0 හෝ 1 තත්වයක් ලබා දෙන්න. ප්‍රකාශන සෑදී ඇත්තේ කොන්දේසි සහිත ප්‍රකාශන යටතේ පහත විස්තර කර ඇති ප්‍රාථමිකයන්ගෙනි. [[සහ] අතර වචන මත වචන බෙදීම සහ මාර්ග නාම ප්‍රසාරණය සිදු නොවේ; tilde ප්‍රසාරණය, පරාමිතිය සහ විචල්‍ය ප්‍රසාරණය, අංක ගණිත ප්‍රසාරණය, විධාන ආදේශනය, ක්‍රියාවලි ආදේශනය සහ මිල ගණන් ඉවත් කිරීම සිදු කරනු ලැබේ. -F වැනි කොන්දේසි සහිත ක්‍රියාකරුවන් ප්‍රාථමිකයන් ලෙස පිළිගැනීමට නම් නොකළ යුතුය.

[[, <සහ> ක්‍රියාකරුවන් සමඟ භාවිතා කරන විට වත්මන් පෙදෙසි භාවිතා කරමින් ශබ්දකෝෂ විද්‍යාත්මකව වර්ග කරයි.

මෙය නූල්, අංක සහ ලිපිගොනු testදීමනා වැනි තරමක් සංසන්දනය කිරීම සඳහා උසස් පරීක්ෂණයක් ඉදිරිපත් කරයි, නමුත් වඩා බලවත් ය.

[ expr ]කොන්දේසි සහිත ප්‍රකාශනය තක්සේරු කිරීම මත පදනම්ව 0 (සත්‍ය) හෝ 1 (අසත්‍ය) තත්වයක් ලබා දෙන්න. එක් එක් ක්‍රියාකරු සහ විවෘත කිරීම වෙනම තර්කයක් විය යුතුය. ප්‍රකාශන සෑදී ඇත්තේ කොන්දේසි සහිත ප්‍රකාශන යටතේ ඉහත විස්තර කර ඇති ප්‍රාථමිකයන්ගෙනි. පරීක්ෂණය කිසිදු විකල්පයක් පිළිගන්නේ නැත, විකල්පයන්ගේ අවසානය සංකේතවත් කරන තර්කයක් එය පිළිගන්නේ නැත.

[...]

මේ කෙනා කතා කරනවා test. ඇත්ත වශයෙන්ම, පැරණි දිනවල, [සංකේතාත්මක සම්බන්ධයක් විය test. එය එකම ආකාරයකින් ක්‍රියාත්මක වන අතර ඔබට එකම සීමාවන් ඇත. ද්විමය එය ආරම්භ කළ නම දන්නා බැවින්, පරීක්ෂණ වැඩසටහනට පරාමිතියක් සොයා ගන්නා තෙක් පරාමිතීන් විග්‍රහ කළ හැකිය ]. විනෝද යුනික්ස් උපක්‍රම.

වූ අවස්ථාවක බව සටහන bash, [හා testතවමත් එච්චරමයි බිල්ට් කාර්යයන් ඇත (අදහසක් සඳහන් පරිදි), එම සීමාවන් අදාළ වේ.


1
නමුත් testසහ [බෑෂ් විධාන builtin ඇත්තෙන්ම, නමුත් එය බාහිර ද්විමය ද පවතින බව ඉඩ තිබුණා.
ilkkachu

1
සඳහා වන බාහිර ද්විමය බොහෝ නවීන පද්ධති [සඳහා සංකේතාත්මක සම්බන්ධයක් නොවේ test.
සසම්භාවී 832

1
කෙසේ හෝ, වෙනම ද්විමයන් දෙකක් සෑදීමට ඔවුන් කරදර වීම මට විනෝදජනක ය, ඒවා දෙකම අවශ්‍ය දේ හරියටම ඇත, ඒවා ඒකාබද්ධ කොට කොන්දේසි කිහිපයක් එකතු කරනවා වෙනුවට. ඇත්ත වශයෙන්ම strings /usr/bin/testපෙන්වන්නේ එයට උපකාරක පා text යක් ඇති බැවින් කුමක් කියන්නදැයි මම නොදනිමි.
ilkkachu

2
@ Random832 අනපේක්ෂිත arg0 හැසිරීම වළක්වා ගැනීම සඳහා මම GNU තාර්කිකත්වය ගැන ඔබේ අදහස ලබා ගත්තෙමි, නමුත් POSIX අවශ්‍යතා ගැන, මම එතරම් ස්ථීර නොවෙමි. කරන අතර testවිධාන පැහැදිලිවම සම්මත විසින් නවීන ගොනුව පදනම් විධානය ලෙස පැවැත්ම අවශ්ය වේ, එය කිසිවක් එහි සඳහන් [ප්රභේද්යයක් අවශ්යතාව ද ඒ ආකාරයෙන් ක්රියාත්මක කිරීමට නියමිත. නිදසුනක් ලෙස, සොලාරිස් 11 [ක්‍රියාත්මක කළ හැකි කිසිවක් ලබා නොදෙන නමුත් එය කෙසේ වෙතත්
පොසික්ස්

2
(පිටවීම 1) වරහන් වර්‍ගයෙන් පිටත බලපෑමක් ඇති කරයි.
ඇලෙක්සැන්ඩර්

18

[ එදිරිව [[

මෙම පිළිතුර ප්‍රශ්නයේ [එදිරිව [[උප කුලකය ආවරණය කරයි .

Bash 4.3.11 හි සමහර වෙනස්කම්:

  • POSIX එදිරිව Bash දිගුව:

  • නිත්‍ය විධානය එදිරිව මැජික්

    • [ යනු අමුතු නමක් සහිත සාමාන්‍ය විධානයකි.

      ]එය [තවත් තර්කයක් භාවිතා කිරීම වළක්වයි.

      උබුන්ටු 16.04 හි ඇත්ත වශයෙන්ම එය ක්‍රියාත්මක කළ හැකි වන්නේ /usr/bin/[කොරුටිල්ස් විසිනි, නමුත් බාෂ් බිල්ට් අනුවාදයට ප්‍රමුඛස්ථානයක් ගනී.

      Bash විධානය විග්‍රහ කරන ආකාරයට කිසිවක් වෙනස් නොවේ.

      විශේෂයෙන්, <යළි හරවා යැවීම, &&සහ ||බහු විධානයන් සංයුක්ත කිරීම, එයින් ( )ගැලවී නොගියහොත් උප-ෂෙල් ජනනය කරයි \, සහ වචන ප්‍රසාරණය සුපුරුදු පරිදි සිදු වේ.

    • [[ X ]]යනු Xඉන්ද්‍රජාලිකව විග්‍රහ කළ හැකි තනි ඉදිකිරීමකි . <, &&, ||හා ()විශේෂයෙන් ප්රතිකාර කර ඇති අතර, වචනය පැලෙන නීති වෙනස් වේ.

      =සහ වැනි තවත් වෙනස්කම් =~තිබේ.

      බෂීස් හි: [ගොඩනංවන ලද විධානයක් වන අතර [[එය ප්‍රධාන පදයකි : /ubuntu/445749/whats-the-difference-between-shell-builtin-and-shell-keyword

  • <

  • && හා ||

    • [[ a = a && b = b ]]: සත්‍ය, තාර්කික සහ
    • [ a = a && b = b ]: සින්ටැක්ස් දෝෂය, &&AND විධාන බෙදුම්කරුවෙකු ලෙස විග්‍රහ කර ඇතcmd1 && cmd2
    • [ a = a -a b = b ]: සමාන, නමුත් POSIX³ විසින් ප්‍රතික්ෂේප කරන ලදි
    • [ a = a ] && [ b = b ]: POSIX සහ විශ්වාසනීය සමාන
  • (

    • [[ (a = a || a = b) && a = b ]]: අසත්ය
    • [ ( a = a ) ]: සින්ටැක්ස් දෝෂය, උප ()අක්ෂරයක් ලෙස අර්ථ දැක්වේ
    • [ \( a = a -o a = b \) -a a = b ]: සමාන, නමුත් ()POSIX විසින් ප්‍රතික්ෂේප කරනු ලැබේ
    • { [ a = a ] || [ a = b ]; } && [ a = b ]POSIX සමාන 5
  • පුළුල් කිරීම මත වචන බෙදීම සහ ගොනු නාම උත්පාදනය (භේදය + ග්ලෝබ්)

    • x='a b'; [[ $x = 'a b' ]]: ඇත්ත, උපුටා දැක්වීම් අවශ්‍ය නොවේ
    • x='a b'; [ $x = 'a b' ]: සින්ටැක්ස් දෝෂය, දක්වා පුළුල් වේ [ a b = 'a b' ]
    • x='*'; [ $x = 'a b' ]: වත්මන් නාමාවලියෙහි එක් ගොනුවකට වඩා තිබේ නම් සින්ටැක්ස් දෝෂයකි.
    • x='a b'; [ "$x" = 'a b' ]: POSIX සමාන
  • =

    • [[ ab = a? ]]: true, මන්ද එය රටා ගැලපීම ( * ? [මැජික්) නිසා. වත්මන් නාමාවලියෙහි ඇති ගොනු වෙත ග්ලෝබ් පුළුල් නොවේ.
    • [ ab = a? ]: a?ග්ලෝබ් පුළුල් වේ. එබැවින් වත්මන් නාමාවලියෙහි ඇති ගොනු මත පදනම්ව සත්‍ය හෝ අසත්‍ය විය හැකිය.
    • [ ab = a\? ]: අසත්‍ය, ගෝලීය ව්‍යාප්තිය නොවේ
    • =සහ ==දෙකෙහිම එක [හා සමාන වේ [[, නමුත් ==එය Bash දිගුවකි.
    • case ab in (a?) echo match; esac: POSIX සමාන
    • [[ ab =~ 'ab?' ]]: ව්‍යාජ 4 , සමඟ මැජික් නැති වේ''
    • [[ ab? =~ 'ab?' ]]: සැබෑ
  • =~

    • [[ ab =~ ab? ]]: true, POSIX දිගු කරන ලද නිත්‍ය ප්‍රකාශන ගැලපීම, ?ගෝලීය පුළුල් නොවේ
    • [ a =~ a ]: සින්ටැක්ස් දෝෂයකි. බාෂ් සමාන නොවේ.
    • printf 'ab\n' | grep -Eq 'ab?': POSIX සමාන (තනි පේළි දත්ත පමණි)
    • awk 'BEGIN{exit !(ARGV[1] ~ ARGV[2])}' ab 'ab?': POSIX සමාන.

නිර්දේශය : සැමවිටම භාවිතා කරන්න [].

[[ ]]මා දුටු සෑම ඉදිකිරීමක් සඳහාම POSIX සමානකම් ඇත.

ඔබ ඔබ භාවිතා කරන්නේ [[ ]]නම්:

  • අතේ ගෙන යා හැකි හැකියාව නැති කරන්න
  • වෙනත් බෑෂ් දිගුවක ඇති සංකීර්ණතා ඉගෙන ගැනීමට පා er කයාට බල කරන්න. [යනු අමුතු නමක් සහිත සාමාන්‍ය විධානයක් පමණි, විශේෂ අර්ථකථන කිසිවක් සම්බන්ධ නොවේ.

Orn [[...]]කෝර්න් කවචයේ සමාන ඉදිකිරීම් වලින් ආශ්වාදයක්

² නමුත් සමහර අගයන් aහෝ b(වැනි +හෝ index) අසමත් වන අතර සංඛ්‍යාත්මක සංසන්දනය කරන්නේ නම් aසහ bදශම සංඛ්‍යා ලෙස පෙනේ. expr "x$a" '<' "x$b"දෙකම වටා ක්රියා කරයි.

³ තවද සමහර අගයන් aහෝ bකැමති !හෝ හෝ අසමත් වේ (.

4 බැෂ් 3.2 සහ ඊට ඉහළින් ඇති අතර බැෂ් 3.1 සඳහා අනුකූලතාවය සක්‍රිය කර නොමැත (වැනි BASH_COMPAT=3.1)

5 සහ ෂෙල් ක්‍රියාකරුවන්ට ( සහ ක්‍රියාකරුවන්ට හෝ / ක්‍රියාකරුවන්ට වෙනස්ව ) සමාන ප්‍රමුඛතාවයක් ඇති බැවින් කණ්ඩායම් කිරීම (මෙහි {...;}විධාන කණ්ඩායම වෙනුවට (...)අනවශ්‍ය උපසිරැසියක් ක්‍රියාත්මක කිරීම) අවශ්‍ය නොවේ . එබැවින් සමාන වනු ඇත.||&&||&& [[...]]-o-a [[ a = a ] || [ a = b ] && [ a = b ]


@ ස්ටෙෆාන් චැසෙලාස් තොරතුරු සඳහා ස්තූතියි! මම exprපිළිතුරට එකතු කර ඇත්තෙමි . "බාෂ් දිගුව" යන්නෙන් අදහස් නොකෙරේ, සමහර වාක්‍ය ඛණ්ඩ එකතු කළ පළමු කවචය බාෂ් බව නොවේ, POSIX sh vs Bash ඉගෙනීම දැනටමත් මට පිස්සු වැටීමට ප්‍රමාණවත්ය.
සිරෝ සැන්ටිලි 冠状 病毒 审查 六四 事件 法轮功

man testඔබ උත්සාහ man [කර නැති වී ඇත්දැයි බලන්න . එය POSIX ප්‍රභේදය පැහැදිලි කරයි.
ජොනතන් කෝමාර්

13

උදාහරණ කිහිපයක්:

සාම්ප්‍රදායික පරීක්ෂණය:

foo="some thing"
# check if value of foo is not empty
if [ -n "$foo" ] ; then... 
if test -n "$foo" ; then... 

testහා [ඕනෑම අනෙක් අය වගේ විධාන වේ, ඒ නිසා විචල්ය වචන බවට භේදය එය උද්ධෘත පාඨ තුළ ලක් නොවෙනවා නම්.

නව විලාසිතාවේ පරීක්ෂණය

[[ ... ]] (නව) විශේෂ කවච ඉදිකිරීමක් වන අතර එය ටිකක් වෙනස් ලෙස ක්‍රියා කරයි, වඩාත්ම පැහැදිලිව පෙනෙන දෙය නම් එය වචන බෙදීම් විචල්‍ය නොවන බවයි:

if [[ -n $foo ]] ; then... 

සමහර ලියකියවිලි මෙහි [සහ [[මෙහි .

අංක ගණිත පරීක්ෂණය:

foo=12 bar=3
if (( $foo + $bar == 15 )) ; then ...  

"සාමාන්‍ය" විධානයන්:

ඉහත සියල්ලම සාමාන්‍ය විධානයන් මෙන් ක්‍රියා කරන අතර ifඕනෑම විධානයක් ගත හැකිය:

# grep returns true if it finds something
if grep pattern file ; then ...

බහු විධාන:

නැතහොත් අපට බහු විධාන භාවිතා කළ හැකිය. විධාන කට්ටලයක් ඔතා ඒවා උපසිරැසියෙන් ( ... )ධාවනය කර, ෂෙල් තත්වයේ තාවකාලික පිටපතක් නිර්මාණය කරයි (වැඩ කරන නාමාවලිය, විචල්යයන්). අපට වෙනත් බහලුමක තාවකාලිකව යම් වැඩසටහනක් ක්‍රියාත්මක කිරීමට අවශ්‍ය නම්:

# this will move to $somedir only for the duration of the subshell 
if ( cd $somedir ; some_test ) ; then ...

# while here, the rest of the script will see the new working
# directory, even after the test
if cd $somedir ; some_test ; then ...

1

කණ්ඩායම් විධාන

ඒකකයක් ලෙස ක්‍රියාත්මක කළ යුතු විධාන ලැයිස්තුවක් කාණ්ඩගත කිරීමට බාෂ් ක්‍රම දෙකක් සපයයි.

( list )වරහන් අතර විධාන ලැයිස්තුවක් තැබීමෙන් උප-පරිසරය නිර්මාණය වන අතර ලැයිස්තුවේ ඇති සෑම විධානයක්ම එම උප කුලකයේ ක්‍රියාත්මක වේ. ලැයිස්තුව උප කුලකයකින් ක්‍රියාත්මක වන බැවින්, උපසිරැසිය අවසන් වූ පසු විචල්‍ය පැවරුම් ක්‍රියාත්මක නොවේ.

$ a=1; (a=2; echo "inside: a=$a"); echo "outside: a=$a"
inside: a=2
outside: a=1

{ list; }වක්‍ර වරහන් අතර විධාන ලැයිස්තුවක් තැබීමෙන් වත්මන් කවච සන්දර්භය තුළ ලැයිස්තුව ක්‍රියාත්මක වේ . කිසිදු උපසිරැසියක් නිර්මාණය නොවේ. අර්ධ සළකුණ (හෝ නව රේඛාව) පහත ලැයිස්තුව අවශ්‍ය වේ. මූලාශ්රය

${} Parameter expansion Ex:  ANIMAL=duck; echo One $ANIMAL, two ${ANIMAL}s
$() Command substitution Ex: result=$(COMMAND) 
$(()) Arithmetic expansion Ex: var=$(( 20 + 5 )) 

කොන්දේසි සහිත ඉදිකිරීම්

තනි වරහන එනම් []
සංසන්දනය කිරීම සඳහා ==, !=, <,සහ >භාවිතා කළ යුතු අතර, සංඛ්යාත්මක සැසඳීම් සඳහා eq, ne,ltසහ gtභාවිතා කළ යුතුය.

වැඩි දියුණු කළ වරහන් එනම්[[]]

ඉහත සියලු උදාහරණ වලදී, අපි කොන්දේසි සහිත ප්‍රකාශනය කොටු කිරීම සඳහා භාවිතා කළේ තනි වරහන් පමණි, නමුත් බාෂ් මඟින් තනි වරහන් සින්ටැක්ස් වල වැඩි දියුණු කළ අනුවාදයක් ලෙස සේවය කරන ද්විත්ව වරහන් වලට ඉඩ ලබා දේ.

සංසන්දනය සඳහා ==, !=, <,සහ >වචනාර්ථයෙන් භාවිතා කළ හැකිය.

  • [යනු පරීක්ෂණ විධානය සඳහා සමාන පදයකි. එය කවචයට සාදා තිබුණත් එය නව ක්‍රියාවලියක් නිර්මාණය කරයි.
  • [[ එය නව වැඩිදියුණු කළ අනුවාදයකි, එය මූල පදයක් මිස වැඩසටහනක් නොවේ.
  • [[විසින් අවබෝධ කර ගත හැකි ය Kornහා Bash.

මූලාශ්රය

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.