1 2 3 4 5 | # Of env | grep SHELL # en ter overbodigheid grep username /etc/passwd | awk -F\/ '{print $NF}' |
1 2 3 4 | $ bash $ echo $SHELL /bin/zsh |
1 |
1 2 3 4 5 6 7 | CHARS=(t v p) for C in ${CHARS[@]} do echo -n $C done echo '' |
apt-get install humor?quote:Op maandag 14 januari 2008 12:11 schreef Daniel1976 het volgende:
Daarbij zijn dat commando's die zo ontzettend zielig zijn om te roepen in dit soort topics.quote:Op maandag 14 januari 2008 12:14 schreef Slarioux het volgende:
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
nee, dit kost je postrechten:quote:Op maandag 14 januari 2008 12:14 schreef Slarioux het volgende:
Dat kan je je postrechten kosten Daniel. Zeg maar voor altijd.
mietje slarquote:Op maandag 14 januari 2008 12:54 schreef slacker_nl het volgende:
nee, dit kost je postrechten:
Wat doet 't ofzo? Ik ken niks van code dus zou wel graag weten wat 't is voor ik 't eens uitprobeerquote:
Deze code print de letters TVP op je console.quote:Op woensdag 16 januari 2008 13:52 schreef tony_clifton- het volgende:
[..]
Wat doet 't ofzo? Ik ken niks van code dus zou wel graag weten wat 't is voor ik 't eens uitprobeer
Niet perse natuurlijk, deze code kan je ook gewoon in terminal inkloppen en dan moet het ook werken. Maar in een file is het idd makkelijker, vooral als je moet gaan editten :)quote:Op woensdag 16 januari 2008 13:57 schreef whoops het volgende:
[..]
Deze code print de letters TVP op je console. :)
Om dit de draaien moet je die code in een bestand opslaan (bijvoorbeeld filename.sh), dan met de terminal naar de directory waar het in staat en dan 'chmod +x filename.sh', en uitvoeren door ./filename.sh uit te voeren.
1 2 3 4 5 6 7 8 | 16:03 pts/9 0 wesleys@eniac:/home/wesleys$ which enter enter () { echo "Enter the shell" } 16:03 pts/9 0 wesleys@eniac:/home/wesleys$ enter Enter the shell 16:03 pts/9 0 wesleys@eniac:/home/wesleys$ |
De makkelijkste manier om dit te doen is overigens zo:quote:
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 33 34 35 36 37 | # Define backtitle BACKTITLE="Nice message you got here!" # Define header text HEADER="This text acts like a header!" # Define box format, Height, Width, List Height SIZE_H=20 SIZE_W=50 SIZE_L=30 dialog --backtitle "$BACKTITLE" --checklist "$HEADER" $SIZE_H $SIZE_W $SIZE_L \ "Choice 1" "Description One!" ON \ "Choice 2" "Second Description!" ON \ "Choice 3" "Third and Last!" OFF \ 2> /tmp/checklist.tmp.$$ retval=$? choice=`cat /tmp/checklist.tmp.$$` rm -f /tmp/checklist.tmp.$$ case $retval in 0) if [ -n "$choice" ] then echo "You chose: $choice" else echo "Can't choose?" fi;; 1) echo "Cancel pressed.";; 255) echo "ESC pressed.";; esac |
1 2 3 4 | SIZE_H=20 SIZE_W=50 SIZE_L=3 |
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 33 34 35 36 37 38 39 40 41 42 | # Define backtitle BACKTITLE="'Nice message you got here!'" # Define header text HEADER="'This text acts like a header!'" # Define box format, Height, Width, List Height SIZE_H=20 SIZE_W=50 #SIZE_L=3 choices[0]="'Choice 1' 'Description one!' ON" choices[1]="'Choice 2' 'Description two!' ON" choices[2]="'Choice 3' 'Description three!' OFF" choices[3]="'Choice 4' 'Description four!' ON" choices[4]="'Choice 5' 'Description five!' ON" SIZE_L=${#choices[@]} for ((a=0; a < SIZE_L ; a++)); do line="$line ${choices[$a]}" done choice=$(eval dialog --stdout --backtitle $BACKTITLE --checklist $HEADER $SIZE_H $SIZE_W $SIZE_L $line); retval=$? case $retval in 0) if [ -n "$choice" ] then echo "You chose: $choice" else echo "Can't choose?" fi;; 1) echo "Cancel pressed.";; 255) echo "ESC pressed.";; esac |
1 |
1 2 3 4 5 6 7 8 9 10 | CONFIG_FILE_A='/home/whoops/.server-control' CONFIG_FILE_B='~/.server-control' echo $CONFIG_FILE_A echo $CONFIG_FILE_B if [ -f "$CONFIG_FILE_A" ]; then echo "A exists"; fi if [ -f "$CONFIG_FILE_B" ]; then echo "B exists"; fi |
Je haalt nu twee dingen door elkaar;quote:Op dinsdag 24 juni 2008 18:45 schreef whoops het volgende:
Ik heb 2 vragen.
1: is er een makkelijkere manier om $i met 1 op te hogen?
[ code verwijderd ]
quote:2: In onderstaande code wil ik een dot-file uit m'n homedir inlezen, ik kan deze waarde echter niet variabel maken. Hoe krijg ik dat voor elkaar?
[ code verwijderd ]
1 2 3 4 5 6 7 8 9 10 11 12 13 | CONFIG_FILE_A="$HOME/.env.local" CONFIG_FILE_B="~/.env.local" for i in $CONFIG_FILE_A $CONFIG_FILE_B ; do if [ -f "$i" ]; then echo "'$i' exists"; # Pick any . $i source $i fi done |
Dit is overigens heel erg niet-portable naar ‘sh’ op deze manier. Als je een shell-script moet maken dat onder sh werkt, kun je dit niet gebruiken (daar heb je andere trucs voor, met eval, maar daar begin ik liever niet over.)quote:Op donderdag 19 juni 2008 01:41 schreef slacker_nl het volgende:
Gebruik van arrays
[ code verwijderd ]
Nu weet ik dat whoops 99,9% bash code schrijft, en ik weet ook dat ie in 99,99% geen sh compatible code nodig heeftquote:Op dinsdag 24 juni 2008 19:44 schreef Iblis het volgende:
[..]
Dit is overigens heel erg niet-portable naar ‘sh’ op deze manier. Als je een shell-script moet maken dat onder sh werkt, kun je dit niet gebruiken (daar heb je andere trucs voor, met eval, maar daar begin ik liever niet over.)
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??
Het is meer voor wat complexere scripts zou ik zeggen, er is ook [Linux/Unix] [/Gurus/helpen/newbies]$ ./deel 26 , maar goed, ik wil je wel helpen hoor als je hier je vraag stelt. Die andere topic gaat altijd over Gnome en KDE en zo.quote:Op donderdag 10 september 2009 21:19 schreef ReWout het volgende:
Is dit ook 't topic om te leren hoe je files verplaatst van map x naar map y en programma's opent via shell enzo?
1 |
1 2 3 4 5 6 7 8 9 | # Ziet er ongveer zo uit: # BOOT_IMAGE=/boot/vmlinuz-2.6.32-trunk-686 root=UUID=fcdc06c1-729c-4991-817d-e7f94ce69dc6 ro quiet # De oplossing in perl: cmd_line=$(echo $cmd_line | perl -p -e 's#BOOT_IMAGE=\S+##') # De beetje brakke oplossing met sed.. cmd_line=$(echo $cmd_line | sed -e 's#BOOT_IMAGE=.\+ root=#root=#' |
1 2 3 | # of mooier en meer lijkend op het perl ding: sed -e 's#BOOT_IMAGE=[^[:space:]]\+ ##' |
1 2 3 | commando $i $i.out done; |
1 2 3 | touch "$i" done; |
1 2 3 | convert "$i" -resize 20% th_"$i".jpg done; |
1 2 3 | echo convert "$i" -resize 20% th_"$i".jpg done; |
1 |
Oh ja. Foutje. Foutje van FOK! zelfs, er staat wel *; in de source, maar dat verdwijnt in een code omgeving.quote:Op maandag 1 maart 2010 20:35 schreef SinofEnvy het volgende:
Super, thanks! Ik neem aan dat in je eerste voorbeeld je for i in * bedoelt? Er staat namelijk for i in alleen.
Wat ook kan, want meestal blijft de terminal onderaan staan, is het rooster printen, en dan even wachten, en de volgende iteratie printen (moet het rooster wel telkens even groot zijn).quote:Op donderdag 4 maart 2010 00:30 schreef -Mzraki- het volgende:
Ja, iedere keer na een print het scherm clearen zou idd een idee zijn, maar hoe dat met die library te doen zie ik zo snel niet. Ik vraag het morgen wel even bij college, bedankt voor je antwoord in ieder geval!
1 2 3 4 5 6 7 8 9 10 | int main(void) { ... while(!done) { print_rooster(); sleep(1); //1 seconde //of b.v.: usleep(500000); // 500000 microseconden } |
Zelfs als je een getal terugkrijgt: wat wil je dat je ftp-client daarmee doet?quote:Op zaterdag 18 december 2010 21:38 schreef Dale. het volgende:
Vraagje
Iemand enig idee hoe ik via shell het aantal bestanden tel wat zich in een ftp map bevindt (ben dus met ftp verbonden)?
Bestanden hernoemen, ssh toegang heb ik geloof ik wel (weet alleen niet hoe ik dat opzet, even uitzoeken)quote:Op zaterdag 18 december 2010 21:44 schreef RemcoDelft het volgende:
[..]
Zelfs als je een getal terugkrijgt: wat wil je dat je ftp-client daarmee doet?
Heb je geen ssh-toegang, dat maakt het eenvoudiger.
1 | rename -n 's/(Bestand)(\d+)/$1Wii$2/' Bestand*.jpg |
Tyquote:Op zondag 19 december 2010 03:37 schreef slacker_nl het volgende:
[ code verwijderd ]
Als je tevreden bent, -n weghalen en done
Je kan het ook met een for-loop doen, maar rename commando is handy
Google even op lftp (mirror)quote:Op zondag 19 december 2010 14:27 schreef Dale. het volgende:
[..]
Ty
Ander vraagje hoe upload ik een hele directoy naar ftp? Kan alleen bestanden verplaatsen maar geen dirs..?
Tyquote:
1 | rename -n 's/(Bestand)(\d+)/$1Wii$2/' Bestand*.jpg |
Het is gewoon een perl regexp ja, die -n is dat ie laat zien wat ie zou doen, zonder het daadwerkelijk te doen.quote:Op zondag 19 december 2010 14:56 schreef Dale. het volgende:
[..]
Tyvraagje aan Slacker nog
[ code verwijderd ]
Kun je de regel uitleggen? Waarvoor staat die -n s/ $1 en $2 enzo?
Weet dat -n flag is (weet niet echter wat die doet
\d+ is decimaal of meer
* is wildcard.
Oh wacht gewoon regex toch?
Mijn persoonlijke voorkeur is tegenwoordig scp (ssh-toegang vereist):quote:Op zondag 19 december 2010 14:27 schreef Dale. het volgende:
[..]
Ander vraagje hoe upload ik een hele directoy naar ftp? Kan alleen bestanden verplaatsen maar geen dirs..?
Hmmm die -n flag doet het volgens mij niet bij mequote:Op zondag 19 december 2010 15:33 schreef slacker_nl het volgende:
[..]
Het is gewoon een perl regexp ja, die -n is dat ie laat zien wat ie zou doen, zonder het daadwerkelijk te doen.
1 2 3 4 | -rw-r--r-- 1 admin administrators 5693125 Dec 19 16:36 Morningwood - Nth Degree.mp3 226 Transfer complete ftp> rename -n "Morningwood - Nth Degree.mp3" "test.mp3" 550 -n: No such file or directory |
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |