quote:Op dinsdag 24 juni 2008 19:24 schreef slacker_nl het volgende:
i=$((i + 1))
Dit waren degene die ik zocht, thanks slack...quote:$HOME gebruiken
Je moet dan ‘eval’ gebruiken. eval is een built-in commando dat de argumenten evalueert als waren ze een string in een shell-script.quote:Op dinsdag 24 juni 2008 19:47 schreef slacker_nl het volgende:
Maar hoe zou je dit, voor de lol, in sh compatibel code willen doen dan?
1 2 3 | bar=baz eval echo \$$foo |
1 |
1 2 3 4 5 6 7 | foo1="foo one" foo2="foo two" foo3="foo three" for i in 0 1 2 3; do eval echo \$foo$i; done; |
Het gebruiken van eval doet slacker ook al in zijn antwoord op mijn vraag hierboven...quote:Op dinsdag 24 juni 2008 20:47 schreef Iblis het volgende:
[..]
Je moet dan ‘eval’ gebruiken. eval is een built-in commando dat de argumenten evalueert als waren ze een string in een shell-script.
B.v.
[ code verwijderd ]
De eerste twee regels zijn duidelijk, de derde werkt als volgt: eerst worden de argumenten van het commando ‘eval’ geėvalueerd, dus dat wordt in feite:
[ code verwijderd ]
En dan wordt ‘echo $bar’ geėvalueerd, wat ‘baz’ levert. Zo gaat het ook met je arrays:
[ code verwijderd ]
Dit kan heel traag worden als je b.v. meerdere indices gebruikt, het eval-commando is namelijk vrij traag.
Ik had al het vermoeden dat je deze methode zou gaan gebruiken. Heb hem ook overwogen in eerste instantie, maar vond de array feature veel handigerquote:Op dinsdag 24 juni 2008 20:47 schreef Iblis het volgende:
Dit kan heel traag worden als je b.v. meerdere indices gebruikt, het eval-commando is namelijk vrij traag.
1 2 3 4 5 6 7 8 9 10 | if [ -n "$1" ] ; then CHOICES="$CHOICES $1" LIMIT=$((LIMIT + 1)) #LIMIT=`expr $LIMIT + 1` else CHOICES="" LIMIT=0 fi } |
Goeie zaak, want ik had dit topic nog niet eerder opgemerkt!quote:Op donderdag 28 augustus 2008 11:37 schreef Jo0Lz het volgende:
Centraal.
Het kan ook erger (spreek ik uit ervaring... 8)7 8)7 ):quote:Op maandag 14 januari 2008 11:22 schreef slacker_nl het volgende:
Big fucking warning
Ga nooit "leuk" zijn en mensen vertellen dat ze rm -rf /, moeten uitvoeren, dit wordt ZWAAR bestraft door de mods @hier en terecht. Voor de mensen die niet precies weten wat dit doet: rm -rf is een recursive, geforcede delete (rm == remove) actie op de root van je systeem. Mocht je als root zijn ingelogd dan verwijder je alle bestanden van je systeem en zal je snel merken dat je PC niet meer boot en je al je data kwijt bent. Mocht je een gewone user zijn en dit uitvoeren, dan heb je grote kans dat je homedir pleitte is, en andere bestanden buiten je $HOME, waar jij de eigenaar voor bent en/of group schrijfrechten voor hebt. Voer dit daarom dan ook NOOIT uit (tenzij je pijn leuk vind of als je in een virtuele omgeving zit waar dataverlies niet uitmaakt). Als we een post vinden waarin we dit zien, kijk er dan niet raar vanop dat je niet meer kan posten in DIG, of op heel Fok for that matter. U bent gewaarschuwd!
1 |
rm zelf doet niets met ‘.*’, het is de shell die zo’n pattern matcht en vervang door een lijst van bestanden die eraan voldoen. De Kornshell laat . en .. niet matchen op .*, bash echter soms wel, afhankelijk van de waarde van $GLOBIGNORE. Als je rm -rf .. intypt zal het nog steeds misgaan.quote:Op donderdag 28 augustus 2008 13:22 schreef RemcoDelft het volgende:
Ondertussen is "rm .*" zo slim om te zeggen dat-ie . en .. negeert
Moraal van het verhaal: Unix/Linux doet precies wat je zegt, maar pas altijd op wat je zegt
1 2 3 4 5 6 7 | regex="};" if [[ "$string" =~ $regex ]]; then echo "Jay, ik heb ${#BASH_REMATCH[*]} keer een }; gevonden"; else echo "He verdorie, niets.."; fi |
1 2 3 | nr=`echo "$string" | tr "{" "\n" | wc -l` let nr=nr-1; |
1 2 3 4 5 | $ echo "$string" | tr "}" "\n" | wc -l 8 $ echo "$string" | tr "{" "\n" | wc -l 8 |
Klopt, echter is de sluit "tag" }; dus inclusief de ;quote:Op dinsdag 23 september 2008 10:07 schreef whoops het volgende:
Volgens mij werkt je methode met tr en wc wel hoor.
[ code verwijderd ]
Ik zou overigens niet weten of het efficienter kan.
1 2 3 4 5 6 7 8 9 | nstring=$(echo $string | tr -d -C '{};') leftcount=$(echo $nstring | grep -o '{' | wc -l) rightcount=$(echo $nstring | grep -o '}' | wc -l) if echo "$nstring" | grep -q '};$' && test $leftcount -eq $rightcount; then echo 'bingo'; else echo 'jammer' fi; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | counter = 0; done = 0; } { for (i = 1; i <= length($0); i++) { c = substr($0, i, 1); if (c== "{") { counter++ done = 0; } else if (c == "}") { if (counter == 0) { print "Meer } dan { gevonden!"; exit 1; } counter--; } else if (c == ";" && counter == 0) { done = 1; } } } END { if (counter > 0) { print "Enkele { zijn niet afgesloten!"; exit 1; } if (!done) { print "Geen afsluitende ';' gevonden!" exit 1; } print "Alles in orde." } |
Bedankt voor de reactie, Ik probeer de Named.Conf.Local te parsen van BIND. Hierbij is het nodig dat ik fouten probeer te voorkomen waar dit mogelijk is. Voorbeeld van invoer:quote:Op donderdag 25 september 2008 16:40 schreef Iblis het volgende:
Met AWK kun je nagenoeg hetzelfde als met Perl, zij het vaak iets minder beknopt. Zie onderstaande code. BEGIN wordt uitgevoerd voordat de input wordt gelezen, END altijd nadat alle input is gelezen, en het blok ertussen voor elke regel. Hij scant dus elke regel karakter voor karakter op '}', als de haakjes uit balans zijn komt er een error. Na de laatste } moet een ';' komen. Er is één catch, de input die alleen uit ';' bestaat wordt óók goedgekeurd. Daar kun je misschien expliciet op checken.
Je runt het met awk -f 'bestand' en kunt er dan gewoon via stdin input instoppen.
[ code verwijderd ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | Maar ook: zone "asdf.net" { type master; file "/etc/bind/zones/asdf.net.db";}; zone "asdf.com" { //some comment here type master; file "/etc/bind/zones/asdf.com.db"; allow-transfer { none; } ; }; |
Op dit moment ben ik niet zeker of het de newline character is wat zo loopt te klieren. Wanneer ik het wil echoen op het scherm, krijg ik gewoon een spatie, maar hij word niet gematcht door de \s teken. Ik zal wat meer debuggen en dan kom ik hier op terug.quote:Op zondag 28 september 2008 21:58 schreef Iblis het volgende:
Newlines in reguliere expressies matchen is meestal gewoon ‘\n’, maar veel tools scheiden impliciet op ‘\n’, zodat er dus nooit een ‘\n’ in je string komt. Als je dit weet echter kun je toch simpelweg (in termen van AWK) records inlezen, wat in de praktijk op regels neerkomt, en kijken of die records alleen spaties bevatten. Die records c.q. regels zelf moeten dan wel door ‘\n’ gescheiden zijn.
1 2 3 | echo $bla . ./CS01.WANA-EAS.FI.2008.048.v02.csv ./CS01.BBDD-DSL.FI.2008.018.v02.csv ./rrd.ppt |
1 2 3 4 5 6 | echo $bla . ./CS01.WANA-EAS.FI.2008.048.v02.csv ./CS01.BBDD-DSL.FI.2008.018.v02.csv ./rrd.ppt |
Kan ook zonder de -print. Gebruik ze beide. Maar ik hoef niet over find te loopen.quote:Op dinsdag 23 december 2008 14:38 schreef RemcoDelft het volgende:
Waarom find . -print? Doet dat niet hetzelfde als gewoon "find"?
Ik gebruik altijd zoiets, veel inzichtelijker:
for i in `find`; do echo $i; done
En als niet perse sh compatible code hoeft te schrijven $() is veel sneller dan backticks.quote:If no expression is present, -print will be used as the
expression. Otherwise, if the given expression does not con-
tain any of the primaries -exec, -ok or -print, the given
expression will be effectively replaced by:
( given_expression ) -print
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | TOTAL_MEM=0 TOTAL_PROC=0 DIV=$(perl -e 'print "-" x 40') printf "%-10s %-18s %-10s\n" pid name anon_mem echo $DIV pgrep -lf "^ora_j"| sort -k2 | while read pid name junk ; do [ -z "$pid" ] && continue RES=$(pmap -x $pid 2>/dev/null) [ $? -ne 0 ] && continue RES=$(echo -e "$RES" |tail -1 | awk '{NF=NF-1} {print $NF}' ) printf "%-10d %-18s %-10d\n" $pid $name $RES TOTAL_MEM=$(($TOTAL_MEM + $RES)) TOTAL_PROC=$((TOTAL_PROC +1 )) # Just for testing [ $TOTAL_PROC -eq 5 ] && break done TOTAL_MEM_GB=$(echo "scale = 4; ($TOTAL_MEM/1024)/1024"|bc) echo $DIV printf "TOTALS\n%-10s %-18s %-10s" procs "anon_mem kb" "anon_mem Gb" echo $DIV printf "%-10s %-18s %-10s\n" "$TOTAL_PROC" "$TOTAL_MEM" "$TOTAL_MEM_GB" |
1 |
1 2 3 | pid=$(echo $i | cut -d\$ -f1) name=$(echo $i | cut -d\$ -f2) |
Gebruik dan ook geen bash maar zsh ofzo...quote:Op donderdag 10 september 2009 14:20 schreef slacker_nl het volgende:
[ code verwijderd ]
Waarom print ie niet m'n totalen uit??
Als ik
[ code verwijderd ]
naar
[ code verwijderd ]
Werkt het wel... Why??
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |