Bash හි නූල් සංසන්දනය කරන්නේ කෙසේද


Answers:


1416

If ප්‍රකාශ වල විචල්‍යයන් භාවිතා කිරීම

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

ඒවා නොගැලපෙන විට ඔබට යමක් කිරීමට අවශ්‍ය නම්, ඒ වෙනුවට ආදේශ =කරන්න !=. අදාළ ලියකියවිලි වල සංගීත මෙහෙයුම් සහ අංක ගණිතමය මෙහෙයුම් පිළිබඳ වැඩිදුර කියවිය හැකිය .

අප අවට උපුටා දැක්වීම් භාවිතා කරන්නේ ඇයි $x?

ඔබට උපුටා දැක්වීම් අවශ්‍යය $x, මන්ද එය හිස් නම්, පහත දැක්වෙන පරිදි ඔබේ බෑෂ් ස්ක්‍රිප්ටයට සින්ටැක්ස් දෝෂයක් ඇතිවේ:

if [ = "valid" ]; then

==ක්රියාකරුගේ සම්මත නොවන භාවිතය

==සමානාත්මතාවය සඳහා Bash භාවිතා කිරීමට ඉඩ දෙන බව සලකන්න [, නමුත් මෙය සම්මත නොවේ .

අවට උපුටා දැක්වීම් $xවිකල්ප වන පළමු අවස්ථාව භාවිතා කරන්න :

if [[ "$x" == "valid" ]]; then

හෝ දෙවන අවස්ථාව භාවිතා කරන්න:

if [ "$x" = "valid" ]; then

12
අනපේක්ෂිත ක්‍රියාකරු දෝෂයක දක්වා ඇති පිළිගත් පිළිතුරට එය සම්බන්ධ වන්නේ කෙසේද ? භාවිතා කරන විට මට එකම දෝෂයක් ඇතිවිය [ "$1" == "on" ]. මෙය ["$ 1" = "on"] ලෙස වෙනස් කිරීමෙන් ගැටළුව විසඳුණි.
පියොටර් ඩොබ්‍රොගොස්ට්

82
අවකාශය අවශ්ය වේ.
TAAPSogeking

6
@ ජෝන් ෆෙමිනෙලා බෑෂ් පිටපතක ලිවීමේදී එයට තිබිය යුත්තේ තනි එකක් =සහ දෙකක් නොවේ.
user13107

74
ඔබට භාවිතා කළ නොහැකි බව සඳහන් කිරීම වටී [ $x -eq "valid" ]. -eqයනු සංඛ්‍යා සඳහා සංසන්දනාත්මක ක්‍රියාකරු මිස නූල් නොවේ.
craq

2
Lex ඇලෙක්ස්, කුමන රටාවක (කවදා හෝ නම්) මට රටාව භාවිතා ["x$yes" == "xyes"]කළ xයුතුද? එය පැරණි කාලයේ ධාතූන් වහන්සේද? නැතහොත් සමහර අවස්ථාවල එය සැබවින්ම අවශ්‍යද?
lanoxx

145

නැතහොත්, ඔබට වෙනත් වගන්තියක් අවශ්‍ය නොවේ නම්:

[ "$x" == "valid" ] && echo "x has the value 'valid'"

72
ඔබට වෙනත් වගන්තියක් අවශ්‍ය නම් සහ පිස්සු එක් ලයිනර් එකක් සෑදීමට අවශ්‍ය නම්: ["$ x" == "වලංගු"] && echo "වලංගු" || echo "අවලංගු"
මැට් වයිට්

11
Att මැට් වයිට්: මෙය සාමාන්‍යයෙන් නරක අදහසක් වන අතර echoඑය අසාර්ථක විය හැකිය.
gniourf_gniourf

1
මාකෝ ඇන්ඩ් ඇන්ඩ් මැට් වයිට්
ඩෙකෝ

3
@gniourf_gniourf, ගැටළුවක් නැත, භාවිතා කරන්න [ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid" .
12431234123412341234123

5
43 12431234123412341234123 { echo invalid && false; }වඩා කාර්යක්ෂම වේ ( echo invalid && false ), මන්ද එය අනවශ්‍ය උපලේඛනයක් සඳහා ගෙවීම වළක්වයි.
චාල්ස් ඩෆි

87
a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

සටහන්:

  1. හිස් තැන් අතර ifහා [හා ]වැදගත්
  2. >හා <හරවා යැවීමේ ක්රියාකරුවන් අතර ඒ සමඟ එය පැන ඇත \>හා \<පිළිවෙළින් නූල් සඳහා.

6
අකාරාදී පිළිවෙලට සැසඳීමට ස්තූතියි
ෂැඩි

මගේ ගැටළුව වූයේ එය වචනාර්ථයෙන් වටිනාකමේ කොටසක් ලෙස වට කර $aතිබීමයි " ", එබැවින් $bසාරධර්ම සංසන්දනය කිරීම සඳහා මට ගැලවීමේ චරිතය භාවිතා කිරීමට සිදුවිය. ධාවනය කිරීමෙන් පසු මට මෙය සොයා ගැනීමට හැකි විය bash -x ./script.sh, -x ධජය මඟින් එක් එක් ක්‍රියාත්මක කිරීමේ වටිනාකම බැලීමට ඉඩ ලබා දෙන අතර එය නිදොස්කරණය කිරීමට උපකාරී වේ.
ෂහ්නෙවාස්කාන්

අකාරාදී අනුපිළිවෙල POSIX- ප්‍රමිතිගත නොවන බව සලකන්න, එබැවින් GNU නොවන වේදිකා / බාෂ් නොවන ෂෙල් වෙඩි මත වැඩ කිරීම සහතික නොවේ. අතේ ගෙන යා හැකි බවට සහතික වී ඇත්තේ pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html හි මෙහෙයුම් පමණි .
චාල්ස් ඩෆි

62

ආදේශක කාඩ්පත් භාවිතය සමඟ නූල් සංසන්දනය කිරීම

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi

12
ආදේශක කාඩ්පත් භාවිතා කළ හැක්කේ දකුණු පැත්තේ පමණක් වීම වැදගත් ය! "ආදේශක කාඩ්පත් වටා අතුරුදහන් වීමද සටහන් කරන්න. (btw: ආදේශක කාඩ්පත් සඳහා +1!)
Scz

6
මෙම ව්යාප්තිය $stringB යුතුය (මේ අතර, වම් අත පැත්තේ උපුටා කළ යුතු නොවේ ද,) උපුටා ගත: if [[ $stringA = *"$stringB"* ]]; then.
gniourf_gniourf

මම ගොනුවේ ඇති ගොනු නාමය සඳහා එකම ආදේශක තර්කනය භාවිතා කිරීමට උත්සාහ කරමි. නමුත් එය මට වැඩ කරන්නේ නැත. මෙහි සපයා ඇති විවිධ ආදේශක නූල් උත්සාහ කර ඇත. නමුත් එය සැමවිටම වෙනත් අවස්ථාවකට යයි. stringA මගේ නඩුවේ ගොනු මාර්ගයක් / tmp / ගොනුවක් වන අතර stringB යනු "ගොනුව" වේ.
වර්ෂාව

36

එක් කරුණක් තුළ මට එක් ප්‍රකාශයකට එකඟ නොවිය යුතුය:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

නැත, එය පිස්සු ඔන්ලයින් යන්ත්‍රයක් නොවේ

ඒක හරියට එක වගේ, හ්ම්, ආරම්භක ...

එය එක්තරා ආකාරයකින් භාෂාවක් ලෙස පොදු රටා භාවිතා කරයි;

ඔබ භාෂාව ඉගෙන ගත් පසු.

ඇත්තටම කියවීම සතුටක්

එය එක් විශේෂ කොටසක් සහිත සරල තාර්කික ප්‍රකාශනයකි: තාර්කික ක්‍රියාකරුවන්ගේ කම්මැලි ඇගයීම.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

සෑම කොටසක්ම තාර්කික ප්‍රකාශනයකි; පළමුවැන්න සත්‍ය හෝ අසත්‍ය විය හැකිය, අනෙක් දෙක සැමවිටම සත්‍ය වේ.

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

දැන්, එය ඇගයීමට ලක් කළ විට, පළමුවැන්න පරීක්ෂා කරනු ලැබේ. එය අසත්‍ය නම්, තර්කනයේ දෙවන ක්‍රියාකාරිත්වයට වඩා සහ && එය අදාළ නොවේ. පළමුවැන්න සත්‍ය නොවේ, එබැවින් එය පළමු හා දෙවැන්න සත්‍ය විය නොහැක.
දැන්, මේ අවස්ථාවේ දී තර්කනයේ පළමු පැත්ත හෝ || අසත්‍යය, නමුත් අනෙක් පැත්ත - තුන්වන කොටස - සත්‍ය නම් එය සත්‍ය විය හැකිය.

එබැවින් තෙවන කොටස ඇගයීමට ලක් කෙරේ - ප්රධාන වශයෙන් පණිවුඩය ලිවීම අතුරු ආබාධයක් ලෙස ය. (එය 0සත්‍යය සඳහා ප්‍රති result ලය ඇත, අප මෙහි භාවිතා නොකරයි)

අනෙක් අවස්ථා සමාන ය, නමුත් සරල ය - සහ - මම පොරොන්දු වෙමි! ඒවා - විය හැකිය - කියවීමට පහසුය!
(මට එකක් නැත, නමුත් අළු රැවුල සහිත යුනික්ස් ප්‍රවීණයෙකු වීම මේ සඳහා බොහෝ සෙයින් උපකාරී වේ.)


17
මෙම ... && ... || ...එය ශබ්දාර්ථයෙන් සමාන නොවේ ලෙස සාමාන්යයෙන් මත frown ඇත, (කණගාටුයි greybeard යුනික්ස් ප්රවීණ, ඔබ මේ සියල්ල කාලය සඳහා වැරදි හිටියා) if ... then ... else .... කණගාටු නොවන්න, මෙය පොදු අනතුරකි .
gniourf_gniourf

6
@gniourf_gniourf OP වැරදියි - ඔබ යෝජනා කරන පරිදි ඔවුන් නොදැන සිටිති. ... && ... || ...පරිපූර්ණ වලංගු රටාවක් සහ පොදු බාෂ් මෝඩයකි. එය භාවිතා කිරීම මඟින් පූර්ව දැනුම නියම කරයි (ප්‍රේක්ෂකයන් තුළ ආරම්භකයින් සිටී නම් එය මතකයේ තබා ගැනීම හොඳ විය හැකිය), නමුත් විවෘත මැන්හෝල් ආවරණ වළක්වා ගන්නේ කෙසේදැයි තමන් දන්නා බව ඔප්පු කිරීමට OP හි හිසකෙස් ඇත.
ebpa

3
@ebpa පහත දැක්වෙන ප්‍රකාශය අසත්‍යයේ වටිනාකමක් ලබා දෙන්නේ නම්, ඔහු පහත සඳහන් ප්‍රකාශය ක්‍රියාත්මක කරනු ඇත || ? එසේ නම් එය වැරදියි, සමහර විට gniourf යෝජනා කරන්නේ එයයි
TSG

4
මම හිතුවේ echo එක උදාහරණයක් විතරයි. && පහත දැක්වෙන ප්‍රකාශය තවමත් ශුන්‍ය නොවන අගයක් ලබා දෙනු ඇත
TSG

2
Bash Pitfalls වෙත සබැඳිය පළ කිරීම සඳහා @gniourf_gniourf +1! ඉතා ප්රයෝජනවත්!
ජගුවාර්

21

ඔබට use case / esac ද භාවිතා කළ හැකිය

case "$string" in
 "$pattern" ) echo "found";;
esac

මෙය සමානද?
ytpillai

tytpillai, එය සමානාත්මතාවයයි. ඔබට |පෙර රටාවන් වෙන් කළ හැකි බව මතක තබා ගන්න ). මෙම inප්රකාශය හා සමාන වේ thenදී ifප්රකාශ කර තිබුණි. ඔබ පයිතන් සිට පැමිණියහොත් කළ යුතු දේ පිළිබඳ සෑම ලැයිස්තුවකටම තමන්ගේම ප්‍රකාශයක් ඇති රටා ලැයිස්තුවක් හරහා එය ක්‍රියාත්මක වන බව ඔබට තර්ක කළ හැකිය. කැමති නැහැ substring in string, ඒ වෙනුවට for item in list. *ඔබට elseකොන්දේසියක් අවශ්‍ය නම් ඔබේ අවසාන ප්‍රකාශය ලෙස භාවිතා කරන්න . එය පළමු හමුවීම මත නැවත පැමිණේ.
mazunki

21

පහත දැක්වෙන ස්ක්‍රිප්ට් එක "ටෙස්ටොන්ටීස්" නම් වූ ගොනුවකින් පේළියකින් කියවා එක් එක් පේළිය සරල නූලක්, විශේෂ අක්ෂර සහිත නූලක් සහ සාමාන්‍ය ප්‍රකාශනයක් සමඟ සංසන්දනය කරයි. එය නොගැලපේ නම්, ස්ක්‍රිප්ට් එක පේළිය මුද්‍රණය කරයි, එසේ නොවේ.

Bash හි අවකාශය එතරම්ම වැදගත් ය. එබැවින් පහත සඳහන් දෑ ක්‍රියාත්මක වනු ඇත:

[ "$LINE" != "table_name" ] 

නමුත් පහත සඳහන් දෑ සිදු නොවේ:

["$LINE" != "table_name"] 

එබැවින් කරුණාකර පහත පරිදි භාවිතා කරන්න:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done

ගොනුවක් හරහා යාමට මෙම ප්‍රවේශය භාවිතා කරන්න . එනම්, වෙනත් දේ අතර UUoC ඉවත් කරන්න.
fedorqui 'SO හානිය නවත්වන්න'

එය වැදගත් නොවන bashනමුත් [ඇත්ත වශයෙන්ම බාහිර ද්විමය නිසා ( which [අස්වැන්න වැනි දේ /usr/bin/[)
පැට්‍රික් බර්ග්නර්

11

ආදානයට වලංගු ඇතුළත් කිරීම් කිහිපයක් තිබේ නම් මම බොහෝ විට regexp ගැලපීම් භාවිතා කරමි. උදා: වලංගු ක්‍රියා "ආරම්භය" සහ "නැවැත්වීම" පමණි.

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

$ACTIONද්විත්ව කොමාව භාවිතා කිරීමෙන් මම විචල්‍යය අඩු කරන බව සලකන්න . මෙය එතරම් වයස්ගත වූ බාෂ් අනුවාද වල ක්‍රියා නොකරනු ඇති බව සලකන්න.


9

බාෂ් 4+ උදාහරණ. සටහන: උපුටා දැක්වීම් භාවිතා නොකිරීම වචනවල අවකාශයන් ආදිය ඇති විට ගැටළු ඇති කරයි. සෑම විටම Bash, IMO හි උපුටා දක්වන්න.

Bash 4+ හි උදාහරණ කිහිපයක් මෙන්න:

උදාහරණ 1, නූල් වලින් 'ඔව්' සඳහා පරීක්ෂා කරන්න (සිද්ධි සංවේදී නොවේ):

    if [[ "${str,,}" == *"yes"* ]] ;then

උදාහරණ 2, නූල් වලින් 'ඔව්' සඳහා පරීක්ෂා කරන්න (සිද්ධි සංවේදී නොවේ):

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

උදාහරණ 3, නූල් වලින් 'ඔව්' සඳහා පරීක්ෂා කරන්න (සිද්ධි සංවේදී):

     if [[ "${str}" == *"yes"* ]] ;then

උදාහරණ 4, නූල් වලින් 'ඔව්' සඳහා පරීක්ෂා කරන්න (සිද්ධි සංවේදී):

     if [[ "${str}" =~ "yes" ]] ;then

උදාහරණ 5, නිශ්චිත ගැලපීම (සිද්ධි සංවේදී):

     if [[ "${str}" == "yes" ]] ;then

උදාහරණ 6, නිශ්චිත ගැලපීම (සිද්ධි සංවේදී නොවේ):

     if [[ "${str,,}" == "yes" ]] ;then

උදාහරණ 7, හරියටම ගැලපීම:

     if [ "$a" = "$b" ] ;then

විනෝද වන්න.


මට (මැක් ග්නූ බැෂ් අනුවාදය 4.4.12 (1) - x86_64-ඇපල්-ඩාර්වින් 17.0.0 නිදහස් කරන්න), මට භාවිතා කිරීමට if [ "$a"="$b" ]හෝ එය ක්‍රියා නොකරයි ... සමාන අවකාශයන් තිබිය නොහැක
වර්ණාවලිය

1

මම එය කළේ බාෂ් සහ ඩෑෂ් (ෂ) සමඟ අනුකූල වන ආකාරයට ය :

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac

පූර්ව (එදිරිව එදිරිව එය භාවිතා නොකිරීම අතර ඇති වෙනස කුමක්ද?
mazunki
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.