Teknologian jakaminen

[Linux][Shell][Shell Logic Control] Yksityiskohtainen selitys

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


1.jos tuomio

1.jos-niin

  • kielioppi
    if command
    then
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
  • lyödäifLausunnot eroavat muista ohjelmointikielistä, bashistaifLausunto tuleeJuokse suoraanifSeuraavat komennot
    • Jos komentoSuoritettu oikein (tilakoodi on 0), komento suoritetaan sitten
    • Muuten sitä ei suoriteta tai suoritetaan muita loogisia käskyjä ja lopuksifiLopeta logiikkaohjaus

2.jos-niin-muuta

  • kielioppi
    if command
    then
    	command
    else
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

3.elif

  • kielioppi
if command
then
	command
elif command
then
	command
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.tapaus

  • Voi korvata moniaif-elsehaara
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5. Itse asiassa likaiset kätesi

  • Muistin valvonta
    #!/bin/bash
    
    FreeMem=`free -m | awk 'NR==2 {print $NF}'`
    CHARS="Current memory is $FreeMem"
    
    if [ "$FreeMem" -lt 16000 ]
    then
        echo $CHARS
        echo "内存不足,抓紧维护服务器!"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • Lue vertailukoko
    • Yksihaarainen versio
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      fi
      
      if [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      fi
      
      if [ $a -gt $b ]
      then
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    • monihaarainen versio
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      elif [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      else [ $a -gt $b ]
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
  • MySQL-seurantaskripti
    #!/bin/bash
    
    if [ `netstat -tunlp | grep mysql | wc -l` -ge "1" ]
    then
        echo "MySQL is running"
    else
        echo "MySQL is stopped"
        # systemctl start mysql.service
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • Rsync-käynnistysskripti
    #!/bin/bash
    
    if [ "$#" -ne 1 ]
    then
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    if [ "$1" = "start" ]
    then
        /usr/bin/rsync --daemon
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -ge 1 ]
        then
            echo "Rsync is started"
            exit 0
        fi
    elif [ "$1" = "stop" ]
    then
        killall rsync &>/dev/null
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -eq 0 ]
        then
            echo "Rsync is stopped"
            exit 0
        fi
    elif [ "$1" = "restart" ]
    then
        kill rsync
        sleep 1
    
        killpro=`netstat -tunlp | grep rsync | wc -l`
        /usr/bin/rsync --daemon
        sleep 1
    
        startpro=`netstat -tunlp | grep rsync | wc -l`
    
        if [ "$killpro" -eq 0 -a "$startpro" -ge 1 ]
        then
            echo "Rsync is restarted"
            exit 0
        fi
    else
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

2. Ehdollinen testaus

0. Selitys etukäteen

  • Yleisesti käytetty syntaksi ehdolliseen testaukseen
    Lisää kuvan kuvaus

  • Yleisesti käytetyt merkkijonotestioperaattorit
    Lisää kuvan kuvaus

  • numeerinen vertailu
    Lisää kuvan kuvaus

  • Loogiset operaattorit
    Lisää kuvan kuvaus

  • Jokaisen komennon vertailutaulukko
    Lisää kuvan kuvaus


1.test komento

  • testKomennon lyhin määritelmä voisi ollaArvioi lauseke
    • Jos ehto on tosi, palautetaan arvo 0
    • Jos lauseke ei ole tosi, palautetaan arvo, joka on suurempi kuin 0 - jota voidaan myös kutsua vääräksi arvoksi
    • Helpoin tapa tarkistaa viimeksi suoritetun komennon tila on käyttää$?arvo
  • parametri
    • Tietoja tiedostonimestätyypin tunnistus(olemassa tai ei), kuten:test -e filename

      parametrimerkitys
      -eOnko tiedostonimi olemassa?
      -fOnko tiedoston nimi tiedosto (file)
      -dOnko tiedoston nimi hakemisto (directory)
      -bOnko tiedoston nimiblock devicelaite
      -cOnko tiedoston nimi acharacter devicelaite
      -SOnko tiedoston nimi aSocketasiakirja
      -pOnko tiedoston nimi FIFO (pino) -tiedosto
      -LOnko tiedoston nimi yhteystiedosto
    • tiedostoistaLuvan havaitseminen,Kuten:test -r filename

      parametrimerkitys
      -rOnko tiedostonimelläluettavissaominaisuuksia
      -wOnko tiedostonimelläkirjoitettavaominaisuuksia
      -xOnko tiedostonimelläSuoritettavaominaisuuksia
      -uOnko tiedostonimelläSUIDominaisuuksia
      -gOnko tiedostonimelläSGIDominaisuuksia
      -kOnko tiedostonimelläTahmea palaominaisuuksia
      -sOnko tiedoston nimiei-tyhjä tiedosto
    • noinKahden tiedoston vertailu,Kuten:test file1 -nt file2

      parametrimerkitys
      -nt(uudempi kuin), tuomarifile1Onko parempi kuinfile2Uusi
      -ot(vanhempi kuin), tuomarifile1Onko parempi kuinfile2vanha
      -eftuomarifile1jafile2Olipa kyseessä sama tiedosto, sitä voidaan käyttääkova linkkituomion perusteella
      Tärkein merkitys on määrittää, osoittavatko kaksi tiedostoa samaaninode
    • noinKahden kokonaisluvun määrittäminen,Kuten:test num1 -eq num2

      parametrimerkitys
      -eqKaksi numeroa ovat yhtä suuret
      -neKaksi numeroa eivät ole samat
      -gtnum1enemmän kuinnum2
      -ltnum1vähemmän kuinnum2
      -genum1suurempi tai yhtä suuri kuinnum2
      -lenum1Pienempi kuin tai yhtä suuri kuinnum2
    • päättäväisyysmerkkijonotiedot

      parametrimerkitys
      -zJos se on tyhjä merkkijono, palautatrue
      -nJos se ei ole tyhjä merkkijono, niintrue
      =str1 == str2, sitten takaisintrue
      !=str1 != str2, sitten takaisintrue
    • Useita ehdollisia tuomioita,Kuten:test -r filename -a -x filename

      parametrimerkitys
      -a(ja) Molemmat tilanteet todetaan samanaikaisesti
      -o(tai) jompikumpi näistä kahdesta tilanteesta on totta
      !loogista kieltämistä

2.[]

  • Ehdolliset testit suoritetaan usein skripteillä, ja yleisimmin käytetyt testit ovat hakasulkeet.[]
  • testja[]Vaikutus on sama
  • Peruselementit
    • []Kaksi symbolia on erotettava toisistaan ​​välilyönnillä vasemmalla ja oikealla
    • Sisäisen operaattorin ja toimintamuuttujan välissä on oltava väli, kuten:[ "a" = "b" ]
    • Merkkijonojen vertailun aikana> <Pitää kirjoittaa muodossa> /<paeta
    • []keskipitkä merkkijono tai${}Käytä muuttujia niin paljon kuin mahdollista""Suljetaan lainausmerkeillä, jotta vältetään määrittelemättömät viittaukset arvoihin
      [ -n "$filename" ]
      
      • 1
    • []Voidaan käyttää sisällä-a -oSuorita loogisia operaatioita, ei tueta&& ||
    • []on bash sisäänrakennettu komento

3. Kaksoissulut

1.(())

2.[[]]

  • Kaksinkertaiset kiinnikkeet tarjoavatKehittyneet ominaisuudet merkkijonoille, kuvioiden sovittamiseen ja säännöllisten lausekkeiden sovittamiseen
  • Peruselementit
    • [[]]Kaksi symbolia on erotettava toisistaan ​​välilyönnillä vasemmalla ja oikealla
    • Sisäisen operaattorin ja toimintamuuttujan välissä on oltava väli, kuten:[[ "a" = "b" ]]
    • Merkkijonovertailussa voit käyttää sitä suoraan> <, ei tarvitse paeta
    • [[]]keskipitkä merkkijono tai${}Käytä muuttujia niin paljon kuin mahdollista""lainausmerkkien sisällä
      • Jos ei käytetä""Jos se on lainausmerkeissä, kuvion ja metamerkkien täsmäys suoritetaan.
    • [[]]Voidaan käyttää sisäisesti&& ||Suorita loogisia operaatioita
    • [[]]Se on bashin avainsana
    • [[]]Muut käyttötarkoitukset ovat samat kuin[]Sama

4. Itse asiassa likaiset kätesi

  • Testaa loogista harkintaa
    #!/bin/bash
    
    read -p "Pls input a char:> " var1
    
    [ "${var1}" -eq 1 ] && {
        echo ${var1}
        exit 0
    }
    
    [ "$var1" -eq 2 ] && {
        echo $var1
        exit 0
    }
    
    [ "$var1" -ne "1" -a "$var1" -ne "2" ] && {
        echo "Script Error"
        exit 1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • Simuloitu asennusskripti
    #!/bin/bash
    
    path=/scripts
    
    [ ! -d "$path" ] && mkdir -p scripts
    
    cat << END
    	1.[install lamp]
    	2.[install inmp]
    	3.[exit]
    END
    
    read -p "Pls input your choice:> " num
    
    # 判断输入是否合法
    [[ ! $num =~ [1-3] ]] && {
    	echo "The num you input must be in {1|2|3}"
    	echo "Input Error"
    	exit 1
    }
    
    [ $num -eq 1 ] && {
    	echo "start installing lamp...waiting..."
    	sleep 2
    
    	# 如果该脚本没权限
    	[ ! -x "$path/lamp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 2
    	}
    
    	# 安装脚本
    	source ${path}/lamp.sh
    	exit $?
    }
    
    [ $num -eq 2 ] && {
    	echo "start installing lnmp...waiting..."
    	sleep 2
    	[ ! -x "$path/lnmp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 3
    	}
    	source ${path}/lnmp.sh
    	exit $?
    }
    
    [ $num -eq 3 ] && {
    	echo "Bye~"
    	exit 4
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

3. Silmukka

1.for

  • kielioppi
    for var in list
    do
    	commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • Tuki C-kielen tyyliin
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    
    • 1
    • 2
    • 3
    • 4

2. kun

  • kielioppi: täällätest commandjaif-elseLausekemuoto on sama ja voit käyttää mitä tahansa bash-komentoa

    • Ilmoituswhile/test commandPoistumistilakoodin tulee muuttua silmukan komennon kanssa. Muussa tapauksessa silmukka jatkuu, jos tilakoodi ei muutu.
      while test command
      do
      	commands
      done
      
      • 1
      • 2
      • 3
      • 4
  • whileTilausUseita testikomentoja voidaan kirjoittaa

    • vainViimeisen testikomennon poistumistilakoodia käytetään määrittämään, poistutaanko silmukasta.
    • Kiinnitä huomiota rivinvaihtoihin, useiden testikomentojen tulisi näkyä erikseen jokaisella rivillä
      var1=10
      while echo $var1
      	[ $var1 -ge 0 ]
      do
      	echo "This is inside the loop"
      	var1=$[ $var1 -1 ]
      done
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

3. käskyyn asti

  • untiljawhileJoopäinvastainen tarkoitusuntilKomento edellyttää, että määrität aTestaa komennot, jotka palauttavat nollasta poikkeavat poistumiskoodit
    • Vain jos poistumistilakoodi ei ole 0, bash suorittaa silmukkakomennon
  • kielioppi
    until test commands
    do
    	other commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • untilmyösTukee useita testikomentoja, vain viimeinen määrittää, suorittaako bash muita komentoja
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

4. Ohjaussilmukka

1.tauko

  • vaikutus: Pakota poistumaan minkä tahansa tyyppisestä silmukasta
    • Kun hyppäät ulos useista silmukoista,breakLopettaa automaattisesti suurimman osan muistisilmukasta, jossa se on
  • Lopeta ulkosilmukkanIlmaisee silmukan tason, josta poistutaan. Oletusarvo on 1 ja seuraava taso on 2.
    break n
    
    • 1

2.jatka

  • vaikutus: Ohita tietty silmukka ja siirry suoraan tämän silmukan arviointiosaan.

5. Käsittele silmukan tulos

  • Shell-skriptissä tulos silmukan lähdön jälkeen voi ollaLähdön uudelleenohjaus
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    
    • 1
    • 2
    • 3
    • 4
    • 5