Kipóbálgattam, hogy melyik a gyorsabb 10000 db-bal egy régi, (P1-es?) gépen.
- Tényleg a 2-es a leggyorsabb. - Tényleg az én verzióm a leglassabb :-O
7-8x lassabb, a többi nagyjából egyforma. Bár a 8,3 és a 11,6 között is van majdnem 50%, de még ez is elenyésző az enyémhez képest.
Én mindig ezeket a fajtákat használtam (csak eddig nem kellett a negáltja :)). Asszem ideje átírnom a szkriptjeimet. :)
#1 if ! { [[ "$allat" == 'kutya' ]] || [[ "$allat" == 'macska' ]] || [[ "$allat" == 'eger' ]]; }; then x=x ; fi # itt még nem olvastam a kettőspontról :) real 0m10.152s user 0m10.140s sys 0m0.010s
#2 if ! [[ "$allat" == 'kutya' || "$allat" == 'macska' || "$allat" == 'eger' ]]; then x=x ; fi # a többi is x=x, hogy akkor már legyen mind egyforma real 0m8.300s user 0m8.240s sys 0m0.070s
#3 if ! [ "$allat" == 'kutya' -o "$allat" == 'macska' -o "$allat" == 'eger' ] ; then x=x ; fi real 0m10.314s user 0m10.280s sys 0m0.040s
#4 if ! ([[ $allat == kutya ]] || [[ $allat == macska ]] || [[ $allat == eger ]]); then x=x ; fi real 1m7.919s user 0m19.610s sys 0m48.220s
#5 if [ ! ( "$allat" = "kutya" -o "$allat" = "macska" -o "$allat" = "eger" ) ]; then x=x ; fi real 0m11.628s user 0m11.540s sys 0m0.090s
Az értékadás felesleges. Tudom, hogy szintaktikai okokból tetted oda, de van semmit nem tevő üres utasítás, ez pedig a kettőspont (:), melynek visszatérési értéke true, azaz 0. Egy végtelen ciklus ezek alapján:
if ! [[ "$allat" == 'kutya' || "$allat" == 'macska' || "$allat" == 'eger' ]]; then
if ! [ "$allat" == 'kutya' -o "$allat" == 'macska' -o "$allat" == 'eger' ]; then
A macskakörmök (") illetve aposztrofok (') akkor kellenek, ha fenn áll az esély arra, hogy a string szóközt vagy tabulátort fog tartalmazni, illetve a bash számára speciális karaktert. Hibás, bár jónak látszik:
if [ $a < 5 ]; then
Azért, mert a < a standard input átirányítása, és a [ egy parancs (test), nem pedig egy operátor. A < 5 ] pedig egy-egy paramétere lenne, ha a < literális lenne. Helyesen:
if [ $a \< 5 ]; then
Illetve
if [[ $a < 5 ]]; then
vagy
if (( a < 5 )); then
Amit írtál, hogy subshell-ben futtatod, az is majdnem jó volt, csak a szóközök maradtak le:
if ! ([[ $allat == kutya ]] || [[ $allat == macska ]] || [[ $allat == eger ]]); then
Ebben a helyzetben a zárójel nem azt jelenti, mint a matematikában, hanem a bezárójelezett rész egy önálló process-ben fog futni, így lassabb lesz. Én a második javaslatomat ajánlom.
A logikájával tisztában vagyok (nagyjából) csak a szintaktikájával nem. Nem tudom, hogy hogyan kéne leírni úgy, hogy megegye a unix. És ne ilyeneket írjon, hogy: '(' not expected, vagy '![[' not found
DISTROWATCHos_VERZIO=`grep tar.gz $TEMPFILE_2 | awk -F\> '{print $2}' | awk -F\< '{print $1}' ` Remelem a backslash-ek a helyukon maradnak.... Biztos van ennel elegansabb megoldas is, kis szerencsevel azt is megtudhatjuk :)