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
-
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:
## 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
-
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:
## 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.
-
On je getopt pro bash?
-
On je getopt pro bash?
Myslím si, že ne, ale tak v si to přes Céčko parsneš, ne? :-D
-
On ovšem v Bashi getopt k dispozici je ;)
-
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'`;
# 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