Portál AbcLinuxu, 12. května 2025 03:12
$ ls 111111.a 222222.b 333333.ba skript:
dir=*.c if [[ -z $dir ]]; then echo "c neexistuje" fiNo, lenze do premennej dir sa skutocne ulozi retazec "*.c" a vnutri [[ ]] sa uz pathname expanzia nerobi. Test na neprazdnost tejto premennej vzdy zlyha, takze takto napisany skript si nevsimne neexistenciu c-cka. Nepomaha ani zapnute
shopt -s nullglob
Jedine riesenie co som nasiel je expadndovat cez eval:
dir="`eval echo *.c`"lenze spustenie niekolko desiatoktisic procesov zozerie hrozneho casu a tomu by som sa chcel vyhnut. Riesenie by si malo poradit aj s tym, ze nazov adresara moze obsahovat medzeru, prip. ze adresarov *.c moze byt viac ako jeden. (Napadlo ma spustit forcyklus (kde bash expanduje nazvy suborov) typu
'for i in *.c; do'
, vo vnutri si nastavit flag, ze cyklus aspon raz prebehol=adrear c existuje, a skoncit natvrdo cyklus. Ale radsej by som nejake elegantnejsie riesenie.)
dir=*.c
mi funguje, pokud takový soubor existuje. Nevím k čemu pak -z, existenci lze ověřovat s -e.
dir=*.c
funguje, ale iba stylom, ze ak dam echo $dir
, tak to vypise expandovane subory. Lenze pomocou echo "$dir"
sa da overit, ze ta expanzia nastala az pri volani toho echo a nie v momente priradovania. A kedze v [[ ]] sa pathname expanzia nerobi, tak tam to zlyha.
No, ale vymyslel som dve riesenia.
1.) set -- *.c dir="$1" [[ -z "$dir" ]] && ...2.)
dir=( *.c ) [[ -z "${dir[1]}" ]] && ...Obe riesenia funguju aj pre viac suborov, aj ak obsahuju medzery. Je ale divne, ze pri priradovani premennych sa pathname exp. nerobi, ale pri priradovani poli uz hej.
... [[ -z "${dir[0]}" ]] && ...
shopt -s nullglob
$ time for ((i=0; i<10000; i++)); do a="`eval echo *.c`"; done; echo "$a" real 0m7.878s user 0m2.253s sys 0m5.160s 222.c $ time for ((i=0; i<10000; i++)); do a=( *.c ); done; echo "${a[0]}" real 0m0.495s user 0m0.350s sys 0m0.103s 222.c16x rychlejsie. Podla sys zlozky v 1. pripade vidno, ze vacsinu stravil v rezime jadra, co v tomto priklade moze byt iba vytvaranie a rusenie procesov.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.