Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: SIGSEGV 19 Března 2010, 12:51:56

Název: tip: rozparsovani vstupu v shellovem skriptu
Přispěvatel: SIGSEGV 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
Název: Re: tip: rozparsovani vstupu v shellovem skriptu
Přispěvatel: q66 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.
Název: Re: tip: rozparsovani vstupu v shellovem skriptu
Přispěvatel: LuciusMare 19 Března 2010, 14:29:19
On je getopt pro bash?
Název: Re: tip: rozparsovani vstupu v shellovem skriptu
Přispěvatel: Kedrigern 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
Název: Re: tip: rozparsovani vstupu v shellovem skriptu
Přispěvatel: GdH 19 Března 2010, 14:48:58
On ovšem v Bashi getopt k dispozici je ;)
Název: Re: tip: rozparsovani vstupu v shellovem skriptu
Přispěvatel: q66 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