bash skript

Sekcia: Programovanie 29.07.2009 | 19:47
hafik   Návštevník
Ahojte. Potrebujem poradit. Ucim sa programovat v bashi (kniha Mark G. Sobell - mistrovstvi v linuxu) a narazil som na cvicenie s ktorym neviem pohnut a ku knihe niesu priklady spravnych rieseni:
(strana 514 cvicenie 13) Napiste skript, ktery prevezme jako argument seznam polozek oddelenych dvojteckou a vypise jednotlive polozky radek po radku do standartniho vystupu (bez dvojtecky).
    • Re: bash skript 29.07.2009 | 21:03
      WlaSaTy   Návštevník
      #!/bin/sh
      echo $1 | tr -s : \\n

      ale to nie je riesenie pre ulohu v bash-i, pre bash sa potrebujes pohrat s IFS a poliami v premennych, takze ako domacu ulohu to nespapaju.

      • Re: bash skript 29.07.2009 | 21:29
        hafik   Návštevník
        To nieje domaca uloha. Moje povodne riesenie bolo:
        #!/bin/bash
        IFS=":"
        for foo
        do
           echo $foo
        done

        $ test.sh jedna:dva
        jedna dva

        Podla mna by to teoreticky malo fungovat tak ze do $1 sa ulozi hodnota "jedna", do $2 hodnota "dva" a cyklom for sa postupne pod seba vypisu obydve hodnoty. Nevies preco to tak nefunguje?
        • Re: bash skript 29.07.2009 | 21:45
          WlaSaTy   Návštevník
          $1 je parameter cislo jedna, takze premennu FOO uz nemusis pouzit, rovno ju nahrad...

          PS.: vsetky parametre su schovane ako $*, zvysok je popisany v man bash alebo aj v tej knihe urcite.
          • Re: bash skript 29.07.2009 | 22:49
            hafik   Návštevník
            Premenna foo je potrebna. V cyklu for su premennej foo postupne priradovane hodnoty jednotlivych argumentov prikazovej riadky.
            ( IFS=" \n\t\" )
            $ test.sh jedna dva
            $1 odpoveda "jedna"
            $2 odpoveda "dva"

            ( IFS=":" )
            Problem je v tom ze:
            $ test.sh jedna:dva
            $1 odpoveda "jedna dva"
            $2 odpoveda ""
            • Re: bash skript 30.07.2009 | 00:27
              WlaSaTy   Návštevník
              >Premenna foo je potrebna.
              A na to si ako prisiel?

              >V cyklu for su premennej foo postupne priradovane hodnoty jednotlivych argumentov prikazovej riadky.
              Niesu, ta forka nekoresponduje s zadanim.

              for foo in $*

              a teraz to skus otestovat:
              ./skript.sh prvy\ argument:druhy 'treti: stvrty arg' "pia"ty:"si esty"

              A skus sa zamysliet preco to vypise to co to vypise. Menovite ako to riesi stare a nove rozdelovanie slov.
              • Re: bash skript 30.07.2009 | 03:05
                hafik   Návštevník
                Vdaka tebe som prisiel na riesenie:
                IFS=":"
                pole=($1)
                foo=0
                while [ $foo -le ${#pole[*]} ]; do
                   echo ${pole[$foo]}
                   ((foo++))
                done
                

                Dakujem.
                • Re: bash skript 30.07.2009 | 10:47
                  WlaSaTy   Návštevník
                  Presne tak,
                  expanzia premennych. Jediny problem je v tom, zenie vzdy v tvojom zivote budes mat k dispozicii bash. Unix like world nie je len o dostupnych GNU nastrojoch, obcas mas k dispozicii len prastary posix shell.
    • Re: bash skript 29.07.2009 | 21:05
      Avatar Dare_devil Debian, OpenSuse  Používateľ
      myslim ze sa pri tom pouzije program sed, ale viac ti povedat bohuzial neviem.
      There is no flag large enough to cover the shame of killing innocent people