in ein shell-script? dateiname soll abgefragt werden.convert /pfad/*.png -resize 2480x3508 -units PixelsPerInch -density 300x300 /pfad/[dateiname].pdf
Grüße, Günther
in ein shell-script? dateiname soll abgefragt werden.convert /pfad/*.png -resize 2480x3508 -units PixelsPerInch -density 300x300 /pfad/[dateiname].pdf
Code: Alles auswählen
for src in /pfad/*.png;do
read -p "Ausgabedateiname für $(basename $src)? " dateiname
convert $src -resize 2480x3508 -units PixelsPerInch -density 300x300 $(dirname $src)/${dateiname}.pdf[/quote]
done
Code: Alles auswählen
if [ -e "$(dirname $src)/${dateiname}.pdf" ]; then
# wenigstens eine Warnung
fi
Erklären was Du erreichen willst, ist der ideale Anfang!Vielleicht erkläre ich erst mal, was ich erreichen möchte: Es sollen alle PNGs in einem Verzeichnis in ein PDF in diesem Verzeichnis gesteckt werden
Interessant. Wusste nicht dass das geht. Deswegen die Schleife. Dann ohne Schleife:Bedarf es dazu überhaupt einer Schleife (ich gehe mal davon aus, dass das Konstrukt eine for-Schleife ist). Auf der Konsole/im Terminal ist das ganze ein Einzeiler ohne Schleife
Code: Alles auswählen
read -p "Ausgabedateiname(ohne Erweiterung)? " dateiname
convert /pfad/*.png -resize 2480x3508 -units PixelsPerInch -density 300x300 /pfad/${dateiname}.pdf
Ist wie mit allem. Erst kommt Lernen, dann Verstehen durch Üben, dann Können. Daher die weit verbreitete Abkürzung: LVÜK...aber mit dieser vermaledeiten Shell-Syntax komme ich nicht klar. Und verstehen möchte ich schon, was ich tue.
Du kennst instantfpc?guennid hat geschrieben:Ich kann Pascal, aber mit dieser vermaledeiten Shell-Syntax komme ich nicht klar. Und verstehen möchte ich schon, was ich tue.
Es entspraeche dem Stil eines Unix-Tools mehr, wenn der Dateiname als Argument uebergeben werden wuerde, statt ihn interaktiv einzulesen ...guennid hat geschrieben: dateiname soll abgefragt werden.
Nein, kannte ich nicht danke für den link!tobo hat geschrieben:Du kennst instantfpc?
Code: Alles auswählen
/home/testuser/.cache/instantfpc/test1
Genau diese Schwammigkeit mag ich nun eigentlich gar nicht leiden.heisenberg hat geschrieben:Die geschweiften Klammern sind dafür da, den Variablennamen zu begrenzen. Meist geht das ohne.
Hmmm, könnte ich probieren. Wenn ich recht verstehe, dann meinst du, dass ich den Dateinamen dem script als Parameter mitgeben soll. Dann müsste er nach meiner Spekulation im script trotzdem einer Variablen übergeben werden oder geht das direkt?. Wie wäre denn dann hier die zielführende Syntax?meillo hat geschrieben:Es entspraeche dem Stil eines Unix-Tools mehr, wenn der Dateiname als Argument uebergeben werden wuerde, statt ihn interaktiv einzulesen ...
Da gibt's keine Schwammigkeit, das ist alles exakt definiert. Kannst du hier nachlesen: http://pubs.opengroup.org/onlinepubs/96 ... hap02.htmlguennid hat geschrieben:Genau diese Schwammigkeit mag ich nun eigentlich gar nicht leiden.heisenberg hat geschrieben:Die geschweiften Klammern sind dafür da, den Variablennamen zu begrenzen. Meist geht das ohne.
Ich koennte dir das schon hinschreiben, aber irgendwie denke ich mir, dass du dir nach so langer und aktiver Zeit hier im Forum schon zumindest ein paar Shell-Scripting-Grundlagen aneignen koenntest. Jedenfalls habe ich nicht den Eindruck, dass du nicht dazu faehig waerst. Probier's also erstmal selber; wir helfen dir dann beim Debuggen.Hmmm, könnte ich probieren. Wenn ich recht verstehe, dann meinst du, dass ich den Dateinamen dem script als Parameter mitgeben soll. Dann müsste er nach meiner Spekulation im script trotzdem einer Variablen übergeben werden oder geht das direkt?. Wie wäre denn dann hier die zielführende Syntax?meillo hat geschrieben:Es entspraeche dem Stil eines Unix-Tools mehr, wenn der Dateiname als Argument uebergeben werden wuerde, statt ihn interaktiv einzulesen ...
Das ist paramstr(0) - die ausführbare Datei, die aus dem Skript erzeugt wurde. FPC ist ja ein Compiler und auch wenn da ein Skript geschrieben wird, im Hintergrund wird kompiliert, nicht interpretiert.guennid hat geschrieben:Im zweiten Beispiel irritiert mich diese Ausgabe(?)-Zeile:Code: Alles auswählen
/home/testuser/.cache/instantfpc/test1
Abgelehnt. Die Syntax ist mir zutiefst zuwider. Gute deutschspachige Tutorials gibt's nicht. Aber gut, ich werde mal versuchen, den Parameter einer Variablen anzudrehen, obwohl - ich weiß nicht mal, wie man einen solchen Parameter im script anspricht. Wenn das funktioniert, kann es ja mit heisenbergs code weitergehen.Probier's also erstmal selber
...gibt es jede Menge. Einen Tip hast Du bereits von mir bekommen. Es gibt noch mindestens 5 andere exzellente Seiten.Gute deutschspachige Tutorials...
Code: Alles auswählen
#!/bin/sh
convert /pfad/*.png -resize 2480x3508 -units PixelsPerInch -density 300x300 /pfad/$1.pdf
Code: Alles auswählen
#!/bin/sh
name=$1
convert /pfad/*.png -resize 2480x3508 -units PixelsPerInch -density 300x300 /pfad/$name.pdf
Deb-Paket gibt's nicht aber 2 *.pas zum kompilieren:guennid hat geschrieben:instantfpc ist offenbar auch nichts für mich. Den ganzen Lazaruskram will ich mir nicht installieren, ein deb-Paket scheint's nicht zu geben.
Dann verwende halt 'ne andere Shell. Das ist doch gerade das Schoene an Unix: Niemand zwingt dich dazu die Bash oder auch nur eine Bourne-kompatible-Shell als Shell zu verwenden. Du kannst auch eine csh verwenden oder fish oder einen Python-Interpreter ... oder deine eigene in Pascal selbst geschriebene Shell -- es ist voellig egal. Einfach in /etc/shells eintragen und mit chsh(1) setzen.guennid hat geschrieben:Die Syntax ist mir zutiefst zuwider.
ist das ergebnis so gewollt? bei mirguennid hat geschrieben:Ok, sowohlals auchCode: Alles auswählen
#!/bin/sh convert /pfad/*.png -resize 2480x3508 -units PixelsPerInch -density 300x300 /pfad/$1.pdf
tun das Gewünschte..Code: Alles auswählen
#!/bin/sh dann ins verzeichnis wechseln name=$1 convert /pfad/*.png -resize 2480x3508 -units PixelsPerInch -density 300x300 /pfad/$name.pdf
Code: Alles auswählen
vorher nachher
test-1.png test-1.pdf
test-2.png test-2.pdf
test.3.png test.3.pdf
Code: Alles auswählen
for i in `ls *.png`; do convert "$i" -resize 2480x3508 -units PixelsPerInch -density 300x300 "${i%.*}.pdf" ; done
Code: Alles auswählen
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" -resize 2480x3508 -units PixelsPerInch -density 300x300 "${0%.*}.pdf"'
Naja sowohl Pascal als auch die Bourne Shell (Basis für Bash (Bourne-again shell)) haben ihre Anfänge in den 1970er-Jahre. Pascal war eher eine Lehrsprache also für Schulen und Universitäten gedacht. Insgesamt also sehr einfach. Die Bourne Shell wurde bei Unix V7 mitgeliefert. Die Anzahl der UNIX-Systeme war bestimmt stark begrenzt und mit früherer Schul-Informatik (Pascal) und heutiger Schul-Informatik (wahrscheinlich MS Office) hatte das rein gar nichts zu tun. Da waren Profis am Werk. Naja heute ist jemand mit seinen Pascal-Kenntnissen im Vergleich zu den heutigen Mausschubsern natürlich schon wieder ein IT-Experte. Um jedoch ernsthaft in Linux einzusteigen sollte man die Möglichkeiten kennen und nicht seine eigenen Wege suchen. Die Shellprogrammierung gehört ähnlich zu Linux wie auch der Vim auch wenn es natürlich viele andere Editoren gibt. Insgesamt halte ich UNIX/Linux bzw. eigentlich seit den 1980er-Jahren eher GNU für eines der am besten durchdachten Konzepte überhaupt, die ihre Anfänge wohl in den 1960er-Jahren mit UNIX hatten. Und die Shellprogrammierung gehört definitiv dazu. Leider entscheidet in der Welt jedoch nicht Qualität über die Verbreitung. Schade eigentlich. Auch sind viele Menschen nicht bereit mal ernsthaft was Neues zu lernen, was eigentlich 40 Jahre alt ist.guennid hat geschrieben:Die Syntax ist mir zutiefst zuwider
Puh. Ich schreibe relative viele Shell-Skripte und muss sagen: Die Syntax ist einfach nicht schön. Leerzeichen, die an einigen Stellen benötigt, an anderen zu Fehlern führen, weil z.B. '[' ein Programm ist, ist schon verwirrend. Und auch, dass ']' als letztes Argument von '[' benötigt wird, ist schon ungewöhnlich (je nach Implementierung). Ich bin davon überzeugt, dass man heute sehr viel anders machen würde. Fließkommazahlen wären heute womöglich auch dabei . Auch der Support für Dictionaries/Hash Tables wäre sicher anders gelöst. Es gibt noch unzählige weitere Stellen, wo man das Sprachdesign heute sicher anders machen würde. Ich bin froh, dass mir tools wie shellcheck[1] helfen, nur wenige Fehler zu machen .uname hat geschrieben:Insgesamt halte ich UNIX/Linux bzw. eigentlich seit den 1980er-Jahren eher GNU für eines der am besten durchdachten Konzepte überhaupt, die ihre Anfänge wohl in den 1960er-Jahren hatten. Und die Shellprogrammierung gehört definitiv dazu. Leider entscheidet in der Welt jedoch nicht Qualität über die Verbreitung. Schade eigentlich. Liegt vielleicht auch daran dass viele Menschen nicht bereit sind mal ernsthaft was Neues zu lernen, was eigentlich 40 Jahre alt ist.
Ich will ja gar nicht shell-scipten. Dafür ist mir Syntax viel zu undurchsichtig. Ich will ein konkretes Problem lösen: Bilder in ein seitenorientiertes PDF-File transferieren. Dazu werde ich schwerlich ein geeignetes Debian-Binary finden. Bleiben für mich zwei Möglichkeiten entweder ich baue mir selbst eins mit Pascal oder ich bemühe die shell. Da das, im vorliegenden Fall wie gezeigt, weiter nichts als ein Einzeiler ist, schien mir das das Praktischere. Aber die Syntax ist eben nicht praktisch. Und ich halte es für absoluten overhead, mir jetzt einen Kopp zu machen, warum ich zuletzt $name in meinem Einzeiler verwenden konnte, während tobo wohl der Ansicht war ${name} wäre zumindest das sicherere. Der Dateiname war übrigens "00004". Vielleicht lag's an den Zahlen. Bei Pascal gibt es sowas wie Typendeklaration. Ich habe Liffis Beitrag nichts hinzuzufügen.meillo hat geschrieben:dieses Rumgejammere, dass du einerseits Shellscripten willst, dich andererseits aber nicht damit befassen willst.
Das liegt an diesem Forum. Anstatt nur eine Lösung für ein Problem zu präsentieren wird gerne etwas weiter ausgeholt. Wie weiter oben steht benötigt man $(name} eigentlich nur dann wenn Zeichen folgen, die den Variablennamen verfälschen. Bei "name123" ist $name123 die Variable name123. Bei ${name}123 ist die Variable $name und 123 folgt dahinter z.B. als Text. In deinem Fall ist "." hinter name keine gültige Variablenbezeichnung und somit kannst du die geschweiften Klammern weglassen. Man kann sich höchtens überlegen ob es besser wäre immer ${} zu fordern. Da war der Programmierer wohl großzügig. Gibt im übrigen auch noch $(), (), (()) und wohl einiges mehr.mir jetzt einen Kopp zu machen
Das ist einfacher nur schöner für den Benutzer. Deshalb erfordert '[' das. Der Befehl selbst hört quasi mit dem ';' auf. Deshalb sind an dieser Stelle die Leerzeichen auch so wichtig.uname hat geschrieben:Die Gründe für die Syntax kenne ich natürlich auch nicht. Ich könnte mir aber vorstellen, dass [ (test) eine schließende Klammer erfordert, um das Ende der Parameter einfacher zu erkennen und somit den Befehl besser zu parsen.