Discussion:
Script mit Parameter *
(zu alt für eine Antwort)
Jan Novak
2020-04-21 07:44:55 UTC
Permalink
Hallo,

ich habe ein Script erstellt, welches PDF Dateien zu einer großen Datei
verbinden soll.

files="$@"
out=""
for t in $files; do
if [ "$(echo $t|grep "\.pdf")" ]; then
out=$out" "$t
if [ ! -e "$t" ]; then
usage
echo -e "\tFEHLER: Datei $t existiert nicht.\n"
exit 2
fi
fi
done
datum=$(date +%Y-%m-%d_%H:%M:%S)
pdftk $out cat output "$datum"_output.pdf


Das funktioniert auch, solange man die zu verbindenden Dateien angibt
oder * wählt ... aber nicht, wenn die zu verbindende PDF Datei ein
Leerzeichen enthält.
Die Zeile(n) unter anderem nach
if [ "$(echo $t|grep "\.pdf")" ]; then
habe ich deshalb, weil beim Parameter * alle Dateien im aktuellen
Verzeichnis übergeben würden, was ja nicht gewünscht ist.

Hat jemand eine Idee, wie man das umschiffen kann, dass man PDF Dateien
als Parameter oder * angeben kann UND diese auch Leerzeichen enthalten
können?

Jan
Stefan Wiens
2020-04-21 07:58:05 UTC
Permalink
Post by Jan Novak
ich habe ein Script erstellt, welches PDF Dateien zu einer großen
Datei verbinden soll.
out=""
for t in $files; do
^^^^^^
An der Stelle findet evtl. unerwünsches Word Splitting statt.
--
Stefan
Jan Novak
2020-04-21 08:34:36 UTC
Permalink
Post by Stefan Wiens
Post by Jan Novak
ich habe ein Script erstellt, welches PDF Dateien zu einer großen
Datei verbinden soll.
out=""
for t in $files; do
^^^^^^
An der Stelle findet evtl. unerwünsches Word Splitting statt.
Das ist kotrrekt. Meine Frage lautet: wie umgehe ich das?
Das Leerzeichen zwischen den Wörtern (Dateien) ist ja gewünscht, nicht
jedoch eines innerhalb einer Datei.


Jan
Alexander Goetzenstein
2020-04-21 08:45:05 UTC
Permalink
Hallo,
Post by Jan Novak
Post by Stefan Wiens
Post by Jan Novak
ich habe ein Script erstellt, welches PDF Dateien zu einer großen
Datei verbinden soll.
out=""
for t in $files; do
^^^^^^
An der Stelle findet evtl. unerwünsches Word Splitting statt.
Das ist kotrrekt. Meine Frage lautet: wie umgehe ich das?
Das Leerzeichen zwischen den Wörtern (Dateien) ist ja gewünscht, nicht
jedoch eines innerhalb einer Datei.
funktioniert es vielleicht mit
files='"'$@'"'
?
--
Gruß
Alex
Felix Palmen
2020-04-21 08:51:44 UTC
Permalink
Post by Jan Novak
Das ist kotrrekt. Meine Frage lautet: wie umgehe ich das?
"$@" tut bereits, was du willst: es quotet jeden einzelnen Parameter.
Das geht aber wieder verloren beim Zuweisen zu $files. Verwende einfach
"$@" direkt in deinem for statement, anstatt eine weitere Variable
einzuführen.
--
Dipl.-Inform. Felix Palmen <***@palmen-it.de> ,.//..........
{web} http://palmen-it.de {jabber} [see email] ,//palmen-it.de
{pgp public key} http://palmen-it.de/pub.txt // """""""""""
{pgp fingerprint} A891 3D55 5F2E 3A74 3965 B997 3EF2 8B0A BC02 DA2A
Juergen Ilse
2020-04-21 09:38:51 UTC
Permalink
Hallo,
Post by Jan Novak
Post by Stefan Wiens
Post by Jan Novak
ich habe ein Script erstellt, welches PDF Dateien zu einer großen
Datei verbinden soll.
out=""
for t in $files; do
^^^^^^
An der Stelle findet evtl. unerwünsches Word Splitting statt.
Das ist kotrrekt. Meine Frage lautet: wie umgehe ich das?
Verzichte auf die Zuweisung und nutze direkt "$@". "$@" enthalt bereits
genau das wordsplitting, wie du es benoetigst, durch die Zuweiosung als
Zeichenkette gehen dirt wichtige Informationen verloren (war ein leerzeichen
nun in "$@" Trennezeichen zwischen Dateinamen oder Teil eines Dateiunamens?),
daher solltest du auf die Zuweisung verzichten und "$@" direkt verwenden.

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Jan Novak
2020-04-21 11:01:53 UTC
Permalink
Post by Jan Novak
Hallo,
Post by Jan Novak
Post by Stefan Wiens
Post by Jan Novak
ich habe ein Script erstellt, welches PDF Dateien zu einer großen
Datei verbinden soll.
out=""
for t in $files; do
^^^^^^
An der Stelle findet evtl. unerwünsches Word Splitting statt.
Das ist kotrrekt. Meine Frage lautet: wie umgehe ich das?
genau das wordsplitting, wie du es benoetigst, durch die Zuweiosung als
Zeichenkette gehen dirt wichtige Informationen verloren (war ein leerzeichen
Tschuess,
OK. ***@all.

Jan
Stefan Reuther
2020-04-21 15:45:30 UTC
Permalink
Weil es noch nicht genannt wurde: diese eingebaute Magie von "$@" lässt
sich mit (Bash-) Array-Variablen nachbilden, wenn man $@ für was anderes
braucht.

files=("$@")
for i in "${files[@]}"; do


Stefan
Jan Novak
2020-04-22 07:22:02 UTC
Permalink
Post by Stefan Reuther
braucht.
das ist natürlich noch besser... Guter Tip.

Jan
Felix Palmen
2020-04-22 07:33:15 UTC
Permalink
Post by Jan Novak
Post by Stefan Reuther
braucht.
das ist natürlich noch besser... Guter Tip.
Aber aufpassen, POSIX-konform ist das nicht. Spielt natürlich keine
Rolle, wenn man sicher sein kann, dass das Script sowieso immer von bash
ausgeführt wird.
--
Dipl.-Inform. Felix Palmen <***@palmen-it.de> ,.//..........
{web} http://palmen-it.de {jabber} [see email] ,//palmen-it.de
{pgp public key} http://palmen-it.de/pub.txt // """""""""""
{pgp fingerprint} A891 3D55 5F2E 3A74 3965 B997 3EF2 8B0A BC02 DA2A
Stefan Reuther
2020-04-22 15:45:33 UTC
Permalink
Post by Felix Palmen
Post by Jan Novak
Post by Stefan Reuther
braucht.
das ist natürlich noch besser... Guter Tip.
Aber aufpassen, POSIX-konform ist das nicht. Spielt natürlich keine
Rolle, wenn man sicher sein kann, dass das Script sowieso immer von bash
ausgeführt wird.
Deswegen "(Bash-)". zsh kann das, wenn ich das auf die Schnelle richtig
überfliege, auch. Mit POSIX ist das Gewünschte, soweit mir bekannt,
nicht erreichbar, da ist "$@" die einzige Variable, die die Magie der
Expansion in mehrere Worte bietet.


Stefan
Felix Palmen
2020-04-22 16:30:04 UTC
Permalink
Post by Stefan Reuther
Deswegen "(Bash-)". zsh kann das, wenn ich das auf die Schnelle richtig
überfliege, auch. Mit POSIX ist das Gewünschte, soweit mir bekannt,
Expansion in mehrere Worte bietet.
War auch nicht als Kritik gemeint, nur als "heads up" :) Ja, zsh kann
das auch, und ich denke du hast Recht mit der Annahme, dass POSIX
derartiges nicht bietet. Im zitierten Script ist das allerdings nicht
nötig, das lässt sich POSIX-konform schreiben indem man direkt "$@"
verwendet. Andernfalls müsste man wohl seltsame Umwege nehmen (z.B. eine
named pipe mit read, das mag ich aber gerade auch nicht ausprobieren).
--
Dipl.-Inform. Felix Palmen <***@palmen-it.de> ,.//..........
{web} http://palmen-it.de {jabber} [see email] ,//palmen-it.de
{pgp public key} http://palmen-it.de/pub.txt // """""""""""
{pgp fingerprint} A891 3D55 5F2E 3A74 3965 B997 3EF2 8B0A BC02 DA2A
Helmut Waitzmann
2020-04-22 22:42:40 UTC
Permalink
Stefan Reuther <***@arcor.de>:

[Feldvariablen im Shell]
Mit POSIX ist das Gewünschte, soweit mir bekannt, nicht
Expansion in mehrere Worte bietet.
Mit gewissem Aufwand kann man mit POSIX die positional parameters
(«"$@"») in einer normalen Shell‐Variablen speichern und auch
daraus wiederherstellen:  Man muss jedes Feldelement in einen Teil
einer Kommandozeile umwandeln.  Dann kann man alle diese Teile mit
Leerzeichen zusammenkleben und in einer Shellvariablen aufheben. 
Wenn man an die einzelnen Elemente ran will, schreibt man


eval "set -- $die_gesammelten_Teile"

und hat sie anschließend in den positional parameters wieder. 


Die folgende POSIX‐Shell‐Funktion «my_quote_words_for_shells»
besorgt das Umwandeln ihrer Parameter in Teile einer Kommandozeile
und anschließende Zusammenkleben und gibt das Resultat in die
Standardausgabe aus.  So lässt sie sich verwenden: 

die_gesammelten_Teile="$( my_quote_words_for_shells "$@" )"
# Jetzt kann "$@" anderweitig benutzt werden.
# ...
# Das Wiederherstellen der vorigen positional parameters "$@"
# geht dann so:
eval "set -- $die_gesammelten_Teile"

Auf diese Weise kann man wenigstens die positional parameters
speichern und wiederherstellen. 

Die Funktion «my_quote_words_for_shells»: 


my_quote_words_for_shells()
(
# gibt eine Wortliste so aus, dass sie als (Teil einer)
# Parameterliste in die Kommandozeile eines POSIX-Shells
# eingefuegt werden kann.
#
# Exit-Code:
# 0, falls die Umsetzung ohne Fehler erfolgt ist,
# !=0, falls ein Fehler aufgetreten ist.
#
# Beispiele:
#
# eine Wortliste als Kommandoaufruf in eine Kommandozeile
# stellen:
#
# if kommandozeile="$(
# my_quote_words_for_shells Programm mit Parametern
# )"
# then
# # verwende sie mittels "eval":
# eval " $kommandozeile"
#
# # oder gib sie einem neuen Shell:
# sh -c -- "$kommandozeile" sh
#
# # oder reiche sie an "su" weiter:
# su -- - ein_Benutzer -c -- "$kommandozeile" -su
#
# # oder verwende sie auf einem anderen Rechner:
# ssh ***@remote.host.example " $kommandozeile"
#
# else
# # Ein Fehler ist bei der Errechnung der Kommandozeile
# # aufgetreten.
# fi
#
#
# Die positional parameters in einer Variablen speichern und
# wieder herstellen:
#
# if args="$(my_quote_words_for_shells "$@")"
# then
# # irgend etwas mit den positional parameters anstellen.
# # ...
#
# # die vorherigen positional parameters wieder herstellen:
#
# eval "set -- $args"
# else
# # Ein Fehler ist beim Sichern der positional parameters
# # aufgetreten.
# fi

# "wordsep" enthaelt ein Trennzeichen fuer die Liste der
# maskierten Woerter. Vor dem ersten Wort braucht keines
# ausgegeben zu werden:

wordsep=
for word
do
# "$wordsep" trennt jedes (auszer das erste) auszugebende Wort
# von seinem Vorgaenger:
printf '%s' "$wordsep"
if test -z "$word"
then
# Es liegt das leere Wort vor. Dann ist das Ergebnis "''":
printf '%s' "''"
else
# Das Wort ist nicht leer.
while
{
prefix="${word%%\'*}"
word="${word#"$prefix"}"
# "$prefix" ist das laengste Anfangsstueck von "$word",
# das keinen Apostroph enthaelt; "$word" erhaelt den Rest.
# Folgerung: "$word" ist entweder leer oder beginnt mit
# einem Apostroph.
if test -n "$prefix"
then
# "$prefix" besteht aus mehr als null Stueck Zeichen.
# Setze sie zwischen zwei Apostrophe:
printf \''%s'\' "${prefix}"
fi
test -n "$word" &&
{
# "$word" ist nicht leer. Folgerung: "$word" beginnt mit
# mindestens einem Apostroph.
apostr="${word%%[!\']*}"
# "$apostr" ist das laengste Anfangsstueck von "$word",
# das nur aus Apostrophen besteht.
if test -n "${apostr#"'"}"
then
# Es hat mindestens 2 Apostrophe: Setze es zwischen
# zwei Anfuehrungszeichen:
printf '"%s"' "${apostr}"
else
# Es besteht aus 1 Apostroph: Stelle ihm einen
# umgekehrten Schraegstrich voran:
printf '\\%s' "${apostr}"
fi
# Schneide das Apostrophe-Anfangsstueck von "$word" ab:
word="${word#"$apostr"}"
# Bleibt nichts mehr uebrig, ist das Wort fertig
# verarbeitet:
${word:+:} false
}
}
do
:
done
fi
# Alle weiteren Woerter (auszer dem ersten) muessen von ihrem
# Vorgaenger mit einem Leerzeichen abgetrennt werden:
wordsep=' '
done
printf '\n'
)
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Helmut Waitzmann
2020-04-21 19:34:03 UTC
Permalink
Post by Jan Novak
ich habe ein Script erstellt, welches PDF Dateien zu einer großen
Datei verbinden soll.
Dein Ansatz war schon mal gut.  Entscheidende Hinweise haben ja
bereits Stefan, Felix und Jürgen gegeben.

Gemeint ist also folgendes: 
Lass das weg:  «"$@"» ist bereits das, was du brauchst. 


Im Einzelnen:  Um eine Liste von Dateinamen zu verarbeiten,
braucht man so etwas wie ein Regal mit mehreren Fächern:  In jedes
Fach kommt ein Dateiname hinein. 

Weil Dateinamen prinzipiell aus jeder Folge von Zeichen, die man
mit dem Shell verarbeiten kann – Leerraum eingeschlossen –,
zusammengesetzt sein können, kommt man mit einfachem
Zusammenkleben mit irgendwelchen Zeichen (die ja ebenfalls
innerhalb eines Dateinamens vorkommen können) als Klebestellen
nicht zurecht.  Man erhält dabei einen Text, der seinerseits ein
gültiger Dateiname sein kann.  => Die Dateinamensgrenzen
verwischen beim Zusammenkleben. 

Im POSIX‐Standard gibt es im Shell keine Feldvariablen, bei denen
es mehrere Fächer gibt.  (Viele moderne Shells haben sie jedoch. 
Aber ich beschränke mich hier auf POSIX.  Das schafft große
Kompatibilität.). 

Das einzige, was im POSIX‐Shell Feldeigenschaften hat, sind die
positional parameters (als Liste «"$@"», einzeln auch als
«"${1}"», «"${2}"», «"${3}"», … ansprechbar), also die Liste der
an den Shell übergebenen Aufrufparameter. 
Post by Jan Novak
out=""
for t in $files; do
Dabei wird die Zusammenklebung aller Dateinamen an jeder Folge von
Leerraumzeichen zerteilt.  Ob der Leerraum dabei eine ehemalige
Klebestelle war oder bereits vorher im Dateinamen enthalten war,
kann man dabei nicht mehr unterscheiden.  Besser ist

for t in "$@"
do

oder, was dasselbe bedeutet, kürzer: 


for t
do
Post by Jan Novak
if [ "$(echo $t|grep "\.pdf")" ]; then
out=$out" "$t
Du willst alle Dateinamen in der Variablen «out» aufsammeln?  Das
funktioniert wie schon oben mit der Variablen «files» nicht.  Aber
Post by Jan Novak
if [ ! -e "$t" ]; then
usage
echo -e "\tFEHLER: Datei $t existiert nicht.\n"
exit 2
"echo" ist bei bestimmten Parametern wie beispielsweise «-e»
sowie auch bei den Zeichenfolgen wie «\t» und «\n»  – auch
«$t» könnte solche enthalten – nicht kompatibel:  Es
reagiert je nach Unix‐System unterschiedlich und gehört
deshalb in den verdienten Ruhestand geschickt.  «printf» ist
angetreten, diese Misere zu beenden: 


if [ ! -e "$t" ]
then
{
usage
printf '\t%s\n\n' 'FEHLER: Datei '"$t"' existiert nicht.'
} >&2

Tipp:  Fehlermeldungen gibt man sinnvollerweise auf den
Fehlerausgabekanal (file descriptor Nr. 2) aus.  Deshalb sind die
Kommandos «usage» und «printf» in Schweifklammern mit
Ausgabeumlenkung auf file descriptor Nr. 2 eingefasst. 

[…]
Post by Jan Novak
Die Zeile(n) unter anderem nach
if [ "$(echo $t|grep "\.pdf")" ]; then
habe ich deshalb, weil beim Parameter * alle Dateien im aktuellen
Verzeichnis übergeben würden, was ja nicht gewünscht ist.
Übergib dem Skript einfach nur die passenden Dateinamen:  Schreibe
im Skript‐Aufruf «*.pdf» statt «*», dann brauchst du nachher keine
falschen Treffer auszusortieren. 
Post by Jan Novak
Hat jemand eine Idee, wie man das umschiffen kann, dass man
PDF Dateien als Parameter oder * angeben kann UND diese
auch Leerzeichen enthalten können?
Ja.  Das Zauberwort heißt «"$@"»:


for t
do
# Wirf den vorne an der Liste der Dateinamen
# stehenden Original-Dateinamen weg. Man braucht ihn
# nicht mehr, denn er steht ja in der Variablen "t":
#
shift &&

# Je nachdem, wie die folgenden Untersuchungen
# aussehen, wird er in veraenderter oder unveraenderter
# Form nachher hinten wieder angefuegt werden:
if [ -e "$t" ]
then
# Die Datei gibt es.
# Stell sicher, dass ihr Name mindestens einen "/"
# enthaelt, sonst koennte es mit "pdftk" Aerger
# geben:
#
case "$t"
in
(*/*)
# Der Dateiname enthaelt mindestens einen "/".
# Alles in Ordnung. Nichts zu tun.
;;
(*)
# Der Dateiname enthaelt keinen "/".
# Fuege "./" vorne an (das ist bei Dateinamen
# ohne (fuehrenden) "/" unschaedlich):
#
t=./"$t"
;;
esac &&

# Der Dateiname enthaelt (jetzt) mindestens einen
# "/". Fuege den Dateienamen hinten an die Liste
# der zu bearbeitenden Dateien an:
#
set -- "$@" "$t"
else
# Die Datei gibt es nicht.
# Fuege ihren Namen nicht hinzu:
#
{
usage
printf '\t%s\n' \
'FEHLER: Eine Datei mit dem Namen' "%s" \
'gibt es nicht.'
exit 2
} >&2
fi
done &&

# Jetzt sind nur noch die Dateinamen existenter Dateien
# in der Dateiliste "$@" enthalten; und die Dateinamen
# enthalten alle wenigstens einen "/".
#
# Das ist gut, denn dann ist sichergestellt, dass keiner
# von ihnen etwa "cat", "attach_files", "unpack_files",
# "burst", "fill_form", "background", "dump_data",
# "dump_data_fields", "update_info", ... heisst.

if ! ${1+:} false
then

# Es sind keine Dateinamen zu bearbeitender Dateien
# uebrig geblieben. Spuck eine Fehlermeldung und
# gib auf:
#
{
usage
printf '\t%s\n' \
'FEHLER: Keine Dateinamen existenter Dateien angegeben.'
exit 2
} >&2
fi &&
# Es gibt jetzt mindestens eine zu bearbeitende Datei.
# Geh ans Werk:
#
datum="$(date +%Y-%m-%d_%H:%M:%S)" &&
pdftk "$@" cat output "$datum"_output.pdf


Anmerkungen:


Der Witz an der «for»‐Schleife


for t
do
shift

set -- "$@" "$t"
done

ist folgender:  Die von der Variablen «t» der Reihe nach
anzunehmenden Werte – die Elemente der positional parameters
«"$@"» – wird zu Beginn der Schleife festgelegt und vom Shell in
seinem internen Gedächtnis festgehalten.  Daran ändert sich auch
nichts, wenn man innerhalb der Schleife an der Liste «"$@"» etwas
ändert, etwa mittels des Kommandos

set -- "$@" "$t"

hintendran ein Element anhängt oder mittels des Kommandos


shift

vorne eines wegnimmt:  Die Liste der von der Variablen «t»
der Reihe nach anzunehmenden Werte bleibt unverändert. 

Verändert wird jedoch die Liste der in den positional parameters
«"$@"» enthaltenen Dateinamen:  Jeder Dateiname wird vorne
abgeschnitten, begutachtet und – je nach Ergebnis – entweder
weggeworfen oder in unveränderter oder veränderter Form hinten
wieder drangehängt. 

Frage:  Warum liefert das das gewünschte Ergebnis? 


Antwort: 

Weil die «for»‐Schleife die an sie übergebene Liste von vorne nach
hinten abarbeitet, ist beim Beginn des ersten Schleifendurchlaufs
das erste Element der positional parameters «"$@"» (also «"$1"»)
das, was im Augenblick auch in der Variablen «t» steht.  Weil das
erste Element mittels

shift

von der Liste «"$@"» vorne abgenommen wird (und die weiteren
aufrücken), ist dann beim Beginn des zweiten Durchlaufs und
jeweils der weiteren Durchläufe auch das jeweils in der Variablen
«t» stehende Element das erste («"$1"») der in der Liste «"$@"»
stehenden Dateinamen. 

=> Jeder Schleifendurchlauf schneidet «seinen» Dateinamen vorne
von der Liste ab. 

=> Wenn alle Schleifendurchläufe fertig sind, sind alle zu
prüfenden Dateinamen vorne von der Liste abgeschnitten. 

In jedem Schleifendurchlauf wird hinten an die Liste genau dann
ein Dateiname angehängt, wenn «"$t"» einen Dateinamen enthält, der
später an «pdftk» übergeben werden soll. 

=> Wenn alle Schleifendurchläufe fertig sind, enthält die Liste
nur noch die Dateinamen, die die Prüfung bestanden haben und an
«pdftk» übergeben werden sollen. 

=> Nach den Schleifendurchläufen ist die Liste jetzt geputzt und
für die Übergabe an «pdftk» bereit. 


«pdftk» erhält beim Aufruf eine Reihe von Dateinamen und dahinter
noch die Parameter «cat», «output» und "«$datum"_output.pdf». 
«cat» und «output» sind dabei nicht als Dateinamen sondern als
Steuerkommandos für «pdftk» gedacht. 

Was geschähe beispielsweise, wenn einer der Dateinamen in «"$@"»
«cat» hieße?  Sage jetzt nicht «Das kommt nie vor!»  Nach Jahren
wirst du das Shell‐Script vielleicht weitergeben und dabei
vergessen, diese Verwendungseinschränkung mitzuteilen, oder du
wirst es selbst wiederverwenden und es ebenfalls vergessen haben. 

Wenn die Entwickler von «pdftk» ihre Hausaufgaben weiterhin
machen, werden sie die Steuerkommandos nie so gestalten, dass der
Anwender keine Möglichkeit hat, jegliche Dateinamen (maschinell)
so zu gestalten, dass sie garantiert nicht wie ein Steuerkommando
aussehen.  Eine bewährte Möglichkeit dafür ist, den «/» in
Steuerkommandos nicht zu verwenden, weil man Dateinamen stehts so
gestalten kann, dass sie mindestens einen «/» enthalten: 

Ein Dateiname, der keinen «/» enthält, bezeichnet eine Datei im
Arbeitsverzeichnis.  Dieselbe Datei wird bezeichnet, wenn man vor
den Dateinamen noch «./» stellt. 


Noch eine Erklärung zum Test


if ! ${1+:} false
then
# Es sind keine Dateinamen zu bearbeitender Dateien
# uebrig geblieben. Spuck eine Fehlermeldung und

Der Parameterauswertungsausdruck «${1+:}» im Shell bedeutet
folgendes:  Wenn es den Parameter «1» gibt, also in «"$@"»
mindestens ein Element (hier: ein Dateiname) enthalten ist, ergibt
die Auswertung von «${1+:}» einen «:», zusammengenommen

if ! : false

«:» ist im Shell ein Kommando, das, egal, ob und welche Parameter
es hat, immer den Exit‐Status 0 liefert.  «!» negiert den
Exit‐Status.  Wenn also mindestens ein Dateiname in der
Parameterliste «"$@"» enthalten ist, wird der «then»‐Teil nicht
ausgeführt. 

Wenn im Gegenteil die Parameterliste «"$@"» aber leer ist, gibt es
den Parameter «1» nicht.  Dann liefert der
Parameterauswertungsausdruck «${1+:}» buchstäblich nichts, und die
Bedingung sieht so aus: 

if ! false

«false» ist ein Kommando, das den Exit‐Status 1 liefert.  «!»
negiert ihn wieder, und es wird entsprechend der Then‐Teil
ausgeführt. 
--
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.
Jan Novak
2020-04-22 07:28:09 UTC
Permalink
Post by Jan Novak
ich habe ein Script erstellt, welches PDF Dateien zu einer großen
Datei verbinden soll.
Dein Ansatz war schon mal gut.  Entscheidende Hinweise haben ja bereits
Stefan, Felix und Jürgen gegeben.
...


Hallo Helmut,

vielen Dank für deine sehr ausführliche Erklärung!!!
Hat mir wunderbar weiter geholfen.

Jan
Loading...