Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: tip: rozparsovani vstupu v shellovem skriptu  (Přečteno 1051 krát)

SIGSEGV

  • Host
tip: rozparsovani vstupu v shellovem skriptu
« kdy: 19 Března 2010, 12:51:56 »
normalne nepisu nic v /bin/sh a /bin/bash (pouzivam opravdove skriptovaci jazyky), ale vcera jsem po dlooouhe dobe musel a prisel jsem mimo jine na genialni rozparsovani argumentu skriptu .. jak je nize videt tak je tam pouzito jak single parametr [-x] tak napr i parametr co ocekava argument [-b foo]

mam z nej radost a rad bych se s nim pochlubil:
Kód: [Vybrat]
## assigning variables, some of them could be changed by passed cli parameters
bin_path=/usr/bin;
tmp_path=/var/tmp/$0.installer
tmp_del=yes;
pretend=no;
verbose_logfile=/dev/null;
pkgadd_opts="-G";
term="xterm-color";
uninstall=no;

## parsing cli parameters and changing predefined variables
until test -z "$1"; do
    case "$1" in
        -h | --help ) usage;;
        -b ) bin_path="$2"; shift;
                test -w $bin_path || checkfail "$bin_path doesn't exist or you have no +w permissions there" 1;;
        -t ) tmp_path=$2; shift;;
        -x ) tmp_del=no;;
        -X ) pretend=yes;;
        -V ) verbose_logfile="$2"; shift;
                test -f $verbose_logfile && checkfail "$verbose_logfile already exists, choose another one, quitting .." 1;;
        -P ) pkgadd_opts="$2"; shift;;
        -T ) term="$2"; shift;;
        -U ) uninstall=yes;;
        * ) checkfail "bad parameter: \"$1\", try -h for help" 1;;
    esac
    shift;
done

q66

Re: tip: rozparsovani vstupu v shellovem skriptu
« Odpověď #1 kdy: 19 Března 2010, 14:08:55 »
normalne nepisu nic v /bin/sh a /bin/bash (pouzivam opravdove skriptovaci jazyky), ale vcera jsem po dlooouhe dobe musel a prisel jsem mimo jine na genialni rozparsovani argumentu skriptu .. jak je nize videt tak je tam pouzito jak single parametr [-x] tak napr i parametr co ocekava argument [-b foo]

mam z nej radost a rad bych se s nim pochlubil:
Kód: [Vybrat]
## assigning variables, some of them could be changed by passed cli parameters
bin_path=/usr/bin;
tmp_path=/var/tmp/$0.installer
tmp_del=yes;
pretend=no;
verbose_logfile=/dev/null;
pkgadd_opts="-G";
term="xterm-color";
uninstall=no;

## parsing cli parameters and changing predefined variables
until test -z "$1"; do
    case "$1" in
        -h | --help ) usage;;
        -b ) bin_path="$2"; shift;
                test -w $bin_path || checkfail "$bin_path doesn't exist or you have no +w permissions there" 1;;
        -t ) tmp_path=$2; shift;;
        -x ) tmp_del=no;;
        -X ) pretend=yes;;
        -V ) verbose_logfile="$2"; shift;
                test -f $verbose_logfile && checkfail "$verbose_logfile already exists, choose another one, quitting .." 1;;
        -P ) pkgadd_opts="$2"; shift;;
        -T ) term="$2"; shift;;
        -U ) uninstall=yes;;
        * ) checkfail "bad parameter: \"$1\", try -h for help" 1;;
    esac
    shift;
done

jo shift v loopu.. to je vcelku standartní metoda, dobře funkční, v případě pokročilejšího parsování je ale dobrý použít getopt.
sw engineer @ samsung research UK, efl developer
octaforge developer (https://octaforge.org)
freebsd user

LuciusMare

  • Závislák
  • ****
  • Příspěvků: 1749
    • Zobrazit profil
Re: tip: rozparsovani vstupu v shellovem skriptu
« Odpověď #2 kdy: 19 Března 2010, 14:29:19 »
On je getopt pro bash?
Citace
<Firzen> tak teď budu Číňan
<Firzen> tak uvidíme :D
Jabber: LuciusMare (zkroucenina) jabbim (tecka) cz

Kedrigern

Re: tip: rozparsovani vstupu v shellovem skriptu
« Odpověď #3 kdy: 19 Března 2010, 14:31:59 »
On je getopt pro bash?
Myslím si, že ne, ale tak v si to přes Céčko parsneš, ne? :-D

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re: tip: rozparsovani vstupu v shellovem skriptu
« Odpověď #4 kdy: 19 Března 2010, 14:48:58 »
On ovšem v Bashi getopt k dispozici je ;)

q66

Re: tip: rozparsovani vstupu v shellovem skriptu
« Odpověď #5 kdy: 19 Března 2010, 16:44:16 »
docela by me zajimalo co je pokrocilejsi parsovani .. to jak jsem to udelal vyse mi pripada docela silne ..

hlavne by me zajimal nejakej priklad, kdy by byla moje metoda nedostatecna .. hmm. jeden me napadl, patrne myslis sdruzovani jednopismenkovbejch single_opts jako -abc misto -a -b -c ..

mmt ..

opts=`echo "$@" | perl -ne 's{ -(\w\w+) }{ join "", map "-$_ ", split //, $1 }egx; print'`;

Kód: (example) [Vybrat]
# echo '-abc -f foo -cde' | perl -ne 's{ -(\w\w+) }{ join "", map "-$_ ", split //, $1 }egx; print'
-a -b -c  -f foo -c -d -e

třeba použití long (--foo=bar a --foo bar) a short (-f bar) parametrů :) - to jsou už tři možné způsoby zápisu + kombinaci se sdružováním parametrů - to už je daleko lepší použít getopt který to udělá v podstatě za tebe
sw engineer @ samsung research UK, efl developer
octaforge developer (https://octaforge.org)
freebsd user

 


Provoz zaštiťuje spolek OpenAlt.