Bash script

Kezdőlap Fórumok Programozás Bash script

10 bejegyzés megtekintése - 121-130 / 438
  • Szerző
    Bejegyzés
  • #2053299
    retaliator44
    Felhasználó

      Közben találtam egy megoldást, ami egyelőre működik:

      Code:
      function beolvas () #a konkrét beolvasó algoritmus
      {
      for ((i=1;i<=xxx;i++))
      do
        read
        sor[$i]="$REPLY"
      done
      }
      # File parameter mode
      if [ $# == 1 ]
      then
        cat "$1" | beolvas
      fi
      # Filter mode
      if [ $# == 0 ]
      then
        beolvas
      fi
      #2053300
      MyCroft
      Felhasználó
        retaliator44 wrote:
        Közben találtam egy megoldást, ami egyelőre működik:

        Code:
        function beolvas () #a konkrét beolvasó algoritmus
        {
        for ((i=1;i<=xxx;i++))
        do
          read
          sor[$i]="$REPLY"
        done
        }
        # File parameter mode
        if [ $# == 1 ]
        then
          cat "$1" | beolvas
        fi
        # Filter mode
        if [ $# == 0 ]
        then
          beolvas
        fi

        Aham, hasonló elven működik, mint az enyém, csak ez nem egy temp fileba, hanem egy tömbbe teszi bele az adatokat. Hogy mikor melyiket kényelmesebb kezelni, azt nyilván az adott feladat dönti el.
        A for ciklus elég „ronda” :), akkor már használható lenne a „true” ciklusfeltételként.

        Illetve, akkor mondok én is mégegyet 🙂
        Ha csak egy paraméter van (pontosabban vagy kap egy filet paraméterként vagy nem), akkor működik ez is:
        cat „$@” | ….
        Ilyenkor vagy a param.ként kapott file tartalmát küldi tovább a pipeon vagy pedig azt ami az stdin-re jön.
        De ha több paramétert kell kezelni, akkor ez már nem jó!!

        #2053301
        retaliator44
        Felhasználó

          cat „$@” | ….

          Ez tetszik 🙂

          #2053302
          budacsik
          Felhasználó

            Sziasztok!
            Így tanulás közben csináltam egy kis szkriptet ami 3 dolgot tud megjeleníteni nekem a kéernyőre:
            1.)    A mai napi sikeres SSH bejelentkezesek log-jai egy usernek.
            2.)    A mai napi sikeres SSH bejelentkezesek log-jai osszesen.
            3.)    A mai napi sikertelen SSH bejelentkezesek log-jai.
            http://users.atw.hu/freeutil/ssh_info.sh
            Itt az egész.
            A gondom az, hogy néha csak az oda tartozó log sorok darabszámát írja ki, de a logokat nem.
            Második vagy 3. próbálkozásra működik, de azért legtöbbször elsőre.

            Van tippetek miért?

            #2053303
            retaliator44
            Felhasználó

              Nekem lenne egy nagyon banális problémám…

              Code:
              (Hibakezelés az elején)

              function beolvas() #két soros file
              {
              for ((i=1;i<=2;i++))
              do
                read
                sor[$i]="$REPLY"
                echo "${sor[i]}"
              done
              }

              # File parameter mode
              if [ $# == 1 ]
              then
                cat "$1" | beolvas
                echo 1 param
              fi
              # Filter mode
              if [ $# == 0 ]
              then
                beolvas
                echo 0 param
              fi
              echo "Na megvan-e még: ${sor[1]}"
              exit 0

              File paraméter esetén nem találja már, szűrő módban igen. Miért és hogy lehetne kijavítani?

              #2053304
              MyCroft
              Felhasználó
                retaliator44 wrote:
                Nekem lenne egy nagyon banális problémám…

                Code:
                (Hibakezelés az elején)

                function beolvas() #két soros file
                {
                for ((i=1;i<=2;i++))
                do
                  read
                  sor[$i]="$REPLY"
                  echo "${sor[i]}"
                done
                }

                # File parameter mode
                if [ $# == 1 ]
                then
                  cat "$1" | beolvas
                  echo 1 param
                fi
                # Filter mode
                if [ $# == 0 ]
                then
                  beolvas
                  echo 0 param
                fi
                echo "Na megvan-e még: ${sor[1]}"
                exit 0

                File paraméter esetén nem találja már, szűrő módban igen. Miért és hogy lehetne kijavítani?

                Nálam működik 🙂
                A gond azzal lehet, hogy az elején nem adtad meg a futtató shellt
                #!/bin/bash
                Ezt az első sorba.
                Megj.: nálam ment enélkül is, de ez lehet rendszerbeállítás függő.
                A gond abból eredhet, hogy a $# == 0 összehasonlítást csak a bash tudja, régebbi shellek, mint például az sh, még csak a $# -eq 0 formát fogadják el.

                Remélem ez megoldja a problémát

                #2053305
                retaliator44
                Felhasználó

                  De megadtam, csak az elejét lenyírtam most a scriptnek hogy ne legyen túl hosszú a beillesztett kód…

                  Nnnya. Szóval a file:

                  Kétsoros
                  File
                  Na jó legyen még egy

                  És komplette amit az előbb ideírtam azt betettem egy scriptbe, elején a bash definícióval.
                  Erre a kimenet:

                  Code:
                  shadowlord@armageddon:~$ cat file|./a
                  Kétsoros
                  File
                  0 param
                  Na megvan-e még: Kétsoros
                  shadowlord@armageddon:~$ ./a file
                  Kétsoros
                  File
                  1 param
                  Na megvan-e még:
                  shadowlord@armageddon:~$ 
                  #2053306
                  MyCroft
                  Felhasználó

                    Jaaa, félreértettelek először.
                    A probléma a | miatt van, ugyanis, a pipe két oldalán lévő „vmi” egyszerre indul el, azaz két külön shell-ben, így amikor függvény létrehozza a sor változót, az frankón műxik, de ugye minden változó lokális arra a shellre, ahol inicializálták.
                    (Próbáld ki, hogy a másik elágazásnál cat | beolvas -t írsz, és lám ott se fog menni 🙂 )
                    Elvileg a változó exportálásával ezt meg lehetne oldani, a baj az, azzal együtt sem megy.

                    Utánaolvastam egy kicsit, és 3.0-ás bash-ban még nem lehetett megcsinálni a tömb exportálást…

                    Hát.. izé…
                    Jobb ötletem nincs, mint az, amit már ajánlottam:

                    Code:
                    if [ $# -eq 0 ]
                    then FNEV=”/tmp/$USER.$$”
                        cat > „$FNEV”
                    else FNEV=”$1″
                    fi
                    ….
                    rm „/tmp/$USER.$$” 2>/dev/null
                    #2053307
                    MyCroft
                    Felhasználó
                      budacsik wrote:
                      Sziasztok!
                      Így tanulás közben csináltam egy kis szkriptet ami 3 dolgot tud megjeleníteni nekem a kéernyőre:
                      1.)    A mai napi sikeres SSH bejelentkezesek log-jai egy usernek.
                      2.)    A mai napi sikeres SSH bejelentkezesek log-jai osszesen.
                      3.)    A mai napi sikertelen SSH bejelentkezesek log-jai.
                      http://users.atw.hu/freeutil/ssh_info.sh
                      Itt az egész.
                      A gondom az, hogy néha csak az oda tartozó log sorok darabszámát írja ki, de a logokat nem.
                      Második vagy 3. próbálkozásra működik, de azért legtöbbször elsőre.

                      Van tippetek miért?

                      Érdekes.
                      Nem lehet h vmi zárolás van a dologban?
                      Ha jól sejtem, amikor vmelyik alkalmazás épp írna abba a log fileba, akkor azt lock-olja a többiek elől. (Mondjuk ettől még olvasni éppen lehetne, de lehet h konzisztencia okokból az sem megengedett). Ezért lehet az, hogy néha nem működik rendesen.
                      Már csak az a kérdés, hogy ha nem lehet olvasni sem, akkor a sorok darabszámát hogy írja ki??

                      #2053308
                      retaliator44
                      Felhasználó
                        MyCroft wrote:
                        Jobb ötletem nincs, mint az, amit már ajánlottam:

                        Nekem azért lenne egy  :rolleyes::
                        Ki kell cserélni ezt itt: cat „$1″|beolvas
                        Erre: beolvas<"$1"
                        És így működik.  :cool1: Csak nem értem, miért nem ugyanazt csinálják, logikusan ekvivalensnek kéne lenniük…

                      10 bejegyzés megtekintése - 121-130 / 438
                      • Be kell jelentkezni a hozzászóláshoz.