Script des Tages: ruler

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Script des Tages: ruler

Beitrag von linuxCowboy » 15.03.2013 10:33:44

Code: Alles auswählen

for i in `seq $COLUMNS`; do
	case $(( i % 10 )) in
		0) e -n $(( i / 10 % 10 ));;
		9) e -n _;;
		*) e -n $(( i % 10 ));;
	esac
done

Code: Alles auswählen

alias ruler='(for i in `seq $COLUMNS`;do case $((i%10)) in 0) e -n $((i/10%10));;9) e -n _;;*) e -n $((i%10));;esac;done)'

Code: Alles auswählen

~$ ll /sbin | head
total 6112
-rwxr-xr-x 1 root root     3104 02.12. 2009 10:33:35 acpi_available
-rwxr-xr-x 1 root root     4508 15.12. 2010 14:40:29 activate
-rwxr-xr-x 2 root root    18552 25.01. 2011 20:19:09 agetty
-rwxr-xr-x 1 root root     3404 02.12. 2009 10:33:35 apm_available
-rwxr-xr-x 1 root root    19456 18.06. 2011 19:46:03 badblocks
-rwxr-xr-x 1 root root    19176 25.01. 2011 20:19:09 blkid
-rwxr-xr-x 1 root root    10484 25.01. 2011 20:19:09 blockdev
-rwxr-xr-x 1 root root    12208 27.03. 2012 23:38:24 bootlogd
-rwxr-xr-x 1 root root    14052 16.08. 2010 23:40:43 capsh

~$ ruler
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112

~$ ll /sbin | head | cut -b 45-52

10:33:35
14:40:29
20:19:09
10:33:35
19:46:03
20:19:09
20:19:09
23:38:24
23:40:43
:wink:

der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Script des Tages: ruler

Beitrag von Natureshadow » 15.03.2013 10:48:19

Häh?

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: AW: Script des Tages: ruler

Beitrag von Meillo » 15.03.2013 11:49:04

Natureshadow hat geschrieben:Häh?
So ging's mir auch.

Es fehlen einfach ein paar erklaerende Saetze. Zudem kann man natuerlich die Qualitaet des Beispiels kritisieren. Die Beispielaufgabe liesse sich einfacher und mit Standardtools so loesen:

Code: Alles auswählen

| awk '{print $8}'
Was die Implementierung angeht, so halte ich es fuer sehr schlechten Stil in Shellscripten lokale Aliase statt den ueblichen Programmnamen zu verwenden (`e').

Die Unterstriche an Stelle der 9 und die Zehnerstelle statt der 0 moegen nur fuer mich ungewohnt und unuebersichtlich sein.

Um meine Kritik nochmal zusammenzufassen:
1) Das Beispiel ist schlecht gewaehlt.
2) Die Implementierung ueberzeugt noch nicht.
3) Es fehlen ein paar erklaerende Saetze. (Das ist der wichtigste Punkt.)


Ich selbst habe auch so ein ruler-Programm auf meinem System, das ich gerne gegenueberstellen will. Es ist simple and stupid, aber dafuer intuitiv verstaendlich, sowohl was den Code als auch was die Ausgabe betrifft. (Und wer braucht schon mehr als 80 Columns? ;-) )

Code: Alles auswählen

$ cat /home/meillo/bin/ruler
#!/bin/sh

cat <<!
         1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
!
Use ed once in a while!

Benutzeravatar
Dogge
Beiträge: 1899
Registriert: 13.09.2010 11:07:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Script des Tages: ruler

Beitrag von Dogge » 15.03.2013 11:58:28

Ok, auch wenn ich ein bisschen C verstehe, stehe ich bei Shellskripten immer da wie der sprichwörtliche Ochs am Berg.
Kann mir mal einer sagen, was ein ruler tun soll?
Debian Testing + Gnome | Linux-Anfänger seit 04/2003
http://files.mdosch.de/2014-07/0xE13D657D.asc

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 15.03.2013 12:01:25

Dogge hat geschrieben: Kann mir mal einer sagen, was ein ruler tun soll?
Es wird ein Lineal ausgegeben, damit du nicht von Hand nachzaehlen musst in welcher Spalte (also das wievielte Zeichen in der Zeile) irgendetwas ist.
Use ed once in a while!

Benutzeravatar
Dogge
Beiträge: 1899
Registriert: 13.09.2010 11:07:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Script des Tages: ruler

Beitrag von Dogge » 15.03.2013 12:03:29

Danke, an so einen simplen Zweck hab ich gar nicht gedacht. :THX:
Debian Testing + Gnome | Linux-Anfänger seit 04/2003
http://files.mdosch.de/2014-07/0xE13D657D.asc

uname
Beiträge: 12402
Registriert: 03.06.2008 09:33:02

Re: Script des Tages: ruler

Beitrag von uname » 15.03.2013 12:29:41

Nicht dass ich es bräuchte oder mit einem textbasierten Lineal vergleichbar wäre aber ich habe den Debianscreenruler gefunden, der vielleicht für jemanden der zufällig diesen Thread list von Interesse ist.

Ach ja zum Thema: Ich kenne noch "nl". Gibt es das vielleicht auch in quer? Oder eine geeignete .screenrc?

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 15.03.2013 12:47:15

Dogge hat geschrieben:Ok, auch wenn ich ein bisschen C verstehe, stehe ich bei Shellskripten immer da wie der sprichwörtliche Ochs am Berg.
Dann sollte dir das hier in bash gefallen:

Code: Alles auswählen

ruler(){
i=1
unset line1 line2
while (( i <= COLUMNS )); do
  if ((i % 10)); then
    line1+=' '
  else
    line1+=$((i / 10))
  fi
  line2+=$((i % 10))
  ((i++))
done
printf '%s\n%s\n' "$line1" "$line2"
}
Oder etwas kompakter:

Code: Alles auswählen

ruler(){
i=1; unset line1 line2
while (( i <= COLUMNS )); do
  ((i % 10)) && line1+=' ' || line1+=$((i / 10))
  line2+=$((i % 10))
  ((i++))
done
printf '%s\n%s\n' "$line1" "$line2"
}
Zuletzt geändert von r900 am 15.03.2013 13:06:02, insgesamt 3-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 15.03.2013 12:50:04

uname hat geschrieben:Nicht dass ich es bräuchte oder mit einem textbasierten Lineal vergleichbar wäre aber ich habe den Debianscreenruler gefunden, der vielleicht für jemanden der zufällig diesen Thread list von Interesse ist.
Bislang ging es nur um Terminalinhalte. Screenruler zaehlt keine Zeichen.
Oder eine geeignete .screenrc?
Das ist ein kreativer Ansatzpunkt.

zsh-User haben sicher auch eine passenden Prompt dafuer. :-D
Use ed once in a while!

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 15.03.2013 17:15:27

Ein kleiner feiner Einzeiler für eine doch häufiger gebrauchte Funktion.

Es braucht keine "Erklärung". Wie ein Kalenderblattspruch.

Höchstens einen Moment des Innehaltens und Nachdenkens!

der_linux_Cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 15.03.2013 17:38:17

linuxCowboy hat geschrieben:Ein kleiner feiner Einzeiler
Ähm.. eine Zeile hört beim Semikolon auf.

Deine lokalen Alias e, ag und keine Ahnung was kannst du in den paar Zeilen doch mal ausschreiben. Wird dir sicherlich jeder danken der es liest.

ChronoBoost
Beiträge: 140
Registriert: 29.01.2013 11:03:50

Re: AW: Script des Tages: ruler

Beitrag von ChronoBoost » 16.03.2013 12:57:29

Meillo hat geschrieben:

Code: Alles auswählen

cat <<!
         1         2         3         4         5         6         7         8
12345678901234567890123456789012345678901234567890123456789012345678901234567890
!
Aber warum so einfach, wenn's auch viel komplizierter geht? ;)

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 16.03.2013 13:08:12

ChronoBoost hat geschrieben:Aber warum so einfach, wenn's auch viel komplizierter geht? ;)
Wo bleibt denn da der Spaß? Ist doch auch viel schöner wenn die Breite variabel ist. :)

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 16.03.2013 20:43:14

Code: Alles auswählen

for i in `seq $COLUMNS`;do case $((i%10)) in 0) e -n $((i/10%10));;9) e -n _;;*) e -n $((i%10));;esac;done # 106
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112

Code: Alles auswählen

for i in `seq $((COLUMNS/10))`;do e -n "`seq -s '' 8`_$((i%10))";done;seq -s '' $((COLUMNS%10)) # 95
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112

Code: Alles auswählen

c=$COLUMNS;for i in `seq $((c/10))`;do e -n 12345678_$((i%10));done;seq -s '' $((c%10)) # 87
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112
e ist ein regulärer hardlink.

Bitte keine Debatten. Besser machen!

-der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 17.03.2013 09:57:44

linuxCowboy hat geschrieben: e ist ein regulärer hardlink.
Zwei Probleme:

1) e ist nicht auf jedem System vorhanden. Dein Script wird also normalerweise nicht einfach verwendet werden koennen.

2) Man kann nur raten *was* bei dir hinter e steckt? (Auf meinem System z.B. ist e ein Link auf ed(1).)

Bitte keine Debatten. Besser machen!
Da stimme ich dir teilweise zu. Nur rumzulabern und zu kritisieren hilft wenig. Wir sollten schon konstruktiv sein. So sehe ich meine Beitraege in diesem Thread aber an. Ich habe eine alternative Implementierung geliefert und ich habe vorgeschlagen was du wie besser machen koenntest.
Use ed once in a while!

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 17.03.2013 12:09:09

linuxCowboy hat geschrieben: e ist ein regulärer hardlink.
Durch ewiges wiederholen wird das auch nicht besser. Dann leg dir noch einen für seq an und dann kommst du auf 83.

Für einen richtigen Vergleich sieht dein code jedenfalls so aus:
linuxCowboy hat geschrieben:

Code: Alles auswählen

c=$COLUMNS;for i in `seq $((c/10))`;do echo -n 12345678_$((i%10));done;seq -s '' $((c%10)) # 90
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112
Mit while und printf kannst du noch ein paar Zeichen rausquetschen

Code: Alles auswählen

i=;c=$COLUMNS;while((i++<c/10));do printf 12345678_$((i%10));done;seq -s '' $((c%10)) # 85
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112
Oder hey, ich behaupte einfach p ist ein hardlink!

Code: Alles auswählen

i=;c=$COLUMNS;while((i++<c/10));do p 12345678_$((i%10));done;seq -s '' $((c%10)) # 80
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112
Zuletzt geändert von r900 am 17.03.2013 21:03:58, insgesamt 1-mal geändert.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 17.03.2013 16:28:39

r900 hat geschrieben:Mit while und printf kannst du noch ein paar Zeichen rausquetschen
Die while Schleife überzeugt mich!

Code: Alles auswählen

i=;c=$COLUMNS;while((i++<c/10));do e -n 12345678_$((i%10));done;seq -s '' $((c%10)) # 83
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112
Den e hardlink sollte es von Haus aus geben. Einer meiner (der) meistgenutzen Befehle.
Wie ll. Niemand schreibt ls -l.

Im Gegensatz zum Softlink braucht er keinen extra Speicherblock.
Im Gegensatz zum Alias ist er immer verfügbar.

Wer den hardlink nicht hat, sollte ihn anlegen.
Wer das nicht will, muss echo ausschreiben.
Wer das gar nicht mitkriegt, hat ganz andere Probleme.
r900 hat geschrieben:Oder hey, ich behaupte einfach p ist ein hardlink!
p wäre wirklich willkürlich. Zu selten gebraucht. (und bei mir ping -c 3)

Damit ist aber wohl das Ende der Fahnenstange erreicht. Besser gehts nicht!??
Zuletzt geändert von linuxCowboy am 21.03.2013 09:16:34, insgesamt 1-mal geändert.
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 17.03.2013 17:11:59

linuxCowboy hat geschrieben: Wie ll. Niemand schreibt ls -l.
Interaktiv ja, aber was Scripte betrifft sollte man unbedingt `ls -l' schreiben.
r900 hat geschrieben:Oder hey, ich behaupte einfach p ist ein hardlink!
p wäre wirklich willkürlich. Zu selten gebraucht. (und bei mir ping -c 3)
Die Unterscheidung zwischen willkuerlich und sinnvoll ist subjektiv. Auf deinem System darfst du gerne tun was du willst und es ist ja auch gerade schoen, dass Unix einen dazu motiviert das zu tun, aber wenn es um Scripte geht und um den Austausch von Code, dann ist es sinnvoll auf Portabilitaet zu achten, denke ich.


Ach, es bleibt dabei, dass ich gerne sehen wuerde, dass du das einsiehst. Aber warum darauf hoffen? Ich belaestige euch in diesem Thread nicht laenger. ;-)
Use ed once in a while!

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 17.03.2013 17:15:33

linuxCowboy hat geschrieben:Im Gegensatz zum Softlink braucht er keinen extra Speicherblock.
Im Gegensatz zum Alias ist er immer verfügbar.
Mag sein, aber

Code: Alles auswählen

$ type echo
echo is a shell builtin
Dein e führt also immer /bin/echo aus anstatt des shell-internen Kommandos.
linuxCowboy hat geschrieben:p wäre wirklich willkürlich. Zu selten gebraucht. (und bei mir ping -c 3)
Egal ob e oder p, beides ist Willkür.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Script des Tages: ruler

Beitrag von linuxCowboy » 17.03.2013 18:30:08

bash legt vor:

Code: Alles auswählen

i=;c=$COLUMNS;while((i++<c/10));do e -n 12345678_$((i%10));done;seq -s '' $((c%10)) # 83
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112
perl arbeitet daran:

Code: Alles auswählen

e $COLUMNS|perl -nE '$c=$_;while(++$i<=$c/10){print "12345678_" . $i%10}END{say substr("123456789",0,$c%10)}' # 109
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112
Muss sich Meister perl hier wirklich geschlagen geben!??
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 17.03.2013 19:01:50

Huch, da war doch gerade noch was von Liffi??

Na jedenfalls so ist es kürzer und kommt ganz ohne "e" aus:

Code: Alles auswählen

perl -E '$c='$COLUMNS';while(++$i<=$c/10){print "12345678_" . $i%10}END{say substr("123456789",0,$c%10)}'
12345678_112345678_212345678_312345678_412345678_512345678_612345678_712345678_812345678_912345678_012345678_112

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Script des Tages: ruler

Beitrag von Liffi » 17.03.2013 19:08:50

r900 hat geschrieben:Huch, da war doch gerade noch was von Liffi??
Ich wollte eine kürzere Perl Version bringen. Hab aber versagt :-D.

EDIT:: wobei mir nicht ganz klar ist, wofür ihr 'END' braucht.

EDIT2:: 'END' und Leerzeichen gelöscht.

Code: Alles auswählen

perl -E '$c='$COLUMNS';while(++$i<=$c/10){print "12345678_".$i%10}{say substr("123456789",0,$c%10)}'

Benutzeravatar
Meillo
Moderator
Beiträge: 9235
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script des Tages: ruler

Beitrag von Meillo » 17.03.2013 20:14:19

Liffi hat geschrieben: EDIT2:: 'END' und Leerzeichen gelöscht.

Code: Alles auswählen

perl -E '$c='$COLUMNS';while(++$i<=$c/10){print "12345678_".$i%10}{say substr("123456789",0,$c%10)}'
btw: Das zweite Paar geschweifter Klammern kann man weglassen.


(Ich kann halt doch nicht meine Klappe halten. :oops: ... aber schoen zu sehen, dass es inhaltlich nun in eine andere Richtung geht. Weiter so!)
Use ed once in a while!

Benutzeravatar
goeb
Beiträge: 348
Registriert: 26.08.2006 18:12:08
Lizenz eigener Beiträge: MIT Lizenz

Re: Script des Tages: ruler

Beitrag von goeb » 17.03.2013 21:04:44

Code: Alles auswählen

perl -E '$c='$COLUMNS';while(++$i<=$c/10){print 1..8,"_",$i%10}say 1..$c%10'
Edit: Noch kürzer:

Code: Alles auswählen

perl -E '$c='$COLUMNS';print 1..8,"_",$i%10 while++$i<=$c/10;say 1..$c%10'
Edit: 3 weniger:

Code: Alles auswählen

perl -E '$c='$COLUMNS';print 1..8,"_",$_%10for++$i..$c/10;say 1..$c%10'
Edit: jetzt aber:

Code: Alles auswählen

perl -E'$c='$COLUMNS';print 1..8,"_",$_%10for 1..$c/10;say 1..$c%10'

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Script des Tages: ruler

Beitrag von r900 » 17.03.2013 21:32:39

goeb hat geschrieben:Edit: jetzt aber:

Code: Alles auswählen

perl -E '$c='$COLUMNS';print 1..8,"_",$_%10for 1..$c/10;say 1..$c%10'
Wer braucht schon Leer- und Anführungszeichen.. perl scheinbar nicht 8O

Code: Alles auswählen

perl -E'$c='$COLUMNS';print 1..8,_,$_%10for 1..$c/10;say 1..$c%10'
12345678_112345678_212345678_312345678_412345678_512345678_6123456

Antworten