bash-script addition mit führenden Nullen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
gosseberry
Beiträge: 15
Registriert: 02.10.2017 08:54:54

bash-script addition mit führenden Nullen

Beitrag von gosseberry » 28.02.2018 15:58:27

Liebe Community,

ich komme hier nicht weiter - bash. Csh ist hier offensichtlich einfacher.

mein bash-script:

Code: Alles auswählen

read -p "Start Untere Schranke; Start Number : " start
read -p "Intervall : " intervall
for i in `ls -1 Dia*`
	do
		j=$(printf "%.4s" "$i")
		echo "$i" "-->" "$j""$start".jpg
		start=$(($start + $intervall))
	done
start = 00001
intervall= 1
==>
Dia-0001.jpg --> Dia-00001.jpg - das ist noch okay; aber bei zweiter Element sollte anstelle Dia-2.jpg --> Dia-00002.jpg stehen.
Dia-0002.jpg --> Dia-2.jpg

Was fehlt? Danke für jeden Tipp.

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: bash-script addition mit führenden Nullen

Beitrag von tobo » 28.02.2018 17:21:31

Bei der Addition verschwinden die führenden Nullen wieder. Zusätzlich sind führende Nullen ein Zeichen für eine Oktalzahl - das willst du hier bestimmt nicht. Ich würde mal sowas probieren:

Code: Alles auswählen

start=$(printf "%05d" $((10#$start + $intervall)))

gosseberry
Beiträge: 15
Registriert: 02.10.2017 08:54:54

Re: bash-script addition mit führenden Nullen

Beitrag von gosseberry » 28.02.2018 19:36:02

tobo hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 17:21:31
Bei der Addition verschwinden die führenden Nullen wieder. Zusätzlich sind führende Nullen ein Zeichen für eine Oktalzahl - das willst du hier bestimmt nicht. Ich würde mal sowas probieren:

Code: Alles auswählen

start=$(printf "%05d" $((10#$start + $intervall)))
Das hatte ich auch schon ==> 0008: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist \"0008\").

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

Re: bash-script addition mit führenden Nullen

Beitrag von Meillo » 28.02.2018 19:46:31

Du musst mit 1 starten und nicht mit 00001. Rechne ohne fuehrende Nullen. Nur zur Ausgabe die fuehrenden Nullen mit printf(1) einfuegen.
Use ed once in a while!

owl102

Re: bash-script addition mit führenden Nullen

Beitrag von owl102 » 28.02.2018 19:54:03

Und bitte ändere

Code: Alles auswählen

for i in `ls -1 Dia*`
nach

Code: Alles auswählen

for i in Dia*
(Siehe auch: http://mywiki.wooledge.org/ParsingLs )

Und außerdem

Code: Alles auswählen

echo "$i" "-->" "$j""$start".jpg
nach

Code: Alles auswählen

echo "$i --> $j$start.jpg"

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: bash-script addition mit führenden Nullen

Beitrag von tobo » 28.02.2018 20:00:35

gosseberry hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 19:36:02
Das hatte ich auch schon ==> 0008: Der Wert ist für die aktuelle Basis zu groß. (Fehlerverursachendes Zeichen ist \"0008\").
Du siehst das 10# vor $start?

gosseberry
Beiträge: 15
Registriert: 02.10.2017 08:54:54

Re: bash-script addition mit führenden Nullen

Beitrag von gosseberry » 01.03.2018 09:11:25

owl102 hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 19:54:03
Und bitte ändere

Code: Alles auswählen

for i in `ls -1 Dia*`
nach

Code: Alles auswählen

for i in Dia*
(Siehe auch: http://mywiki.wooledge.org/ParsingLs )

Und außerdem

Code: Alles auswählen

echo "$i" "-->" "$j""$start".jpg
nach

Code: Alles auswählen

echo "$i --> $j$start.jpg"
Danke für die Anregungen, aber das hatte ich auch schon; es gibt hier auch mehrere Syntax. Okay, das aber alles liefert mir keine Lösung meiner Frage.
Zum Vergleich in der csh sieht es sehr einfach aus und es funktioniert mit der NULLEN.

Code: Alles auswählen

foreach i ( `ls -1 Dia*` )
set j2 = `printf "%.4d" $j`
echo $i "--> Dia-$j2.jpg"

owl102

Re: bash-script addition mit führenden Nullen

Beitrag von owl102 » 01.03.2018 09:31:53

gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 09:11:25
Okay, das aber alles liefert mir keine Lösung meiner Frage.
Die Antwort auf deine Frage wurde doch schon hier beantwortet: viewtopic.php?p=1166552#p1166552

Code: Alles auswählen

foreach i ( `ls -1 Dia*` )
set j2 = `printf "%.4d" $j`
echo $i "--> Dia-$j2.jpg"
Hier machst du es genauso wie von Meillo vorgeschlagen, warum im bash-Code nicht? Obrige Zeilen lassen sich 1:1 nach bash umsetzen, z.B.:

Code: Alles auswählen

for i in Dia*
do
  ...
  j2=$(printf "%.4d" "$j")
  echo $i "--> Dia-$j2.jpg"
  ...
done
Und wenn du mit der csh mehr vertraut bist, warum nimmst du nicht die csh? Was spricht dagegen?

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

Re: bash-script addition mit führenden Nullen

Beitrag von Meillo » 01.03.2018 09:38:29

gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 09:11:25
owl102 hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 19:54:03
Und bitte ändere

Code: Alles auswählen

for i in `ls -1 Dia*`
nach

Code: Alles auswählen

for i in Dia*
(Siehe auch: http://mywiki.wooledge.org/ParsingLs )
Danke für die Anregungen, aber das hatte ich auch schon; es gibt hier auch mehrere Syntax.
Dieser Hinweis ist aber wichtig und mehr als eine Nebensaechlichkeit, das betrifft auch dein Beispiel in der csh! Gerade in dem Fall gibt es auch keinen Grund, der dagegen spricht: Es ist nicht nur sicherer, sondern auch noch performanter und einfacher verstaendlich und weniger Code!

Okay, das aber alles liefert mir keine Lösung meiner Frage.
Zum Vergleich in der csh sieht es sehr einfach aus und es funktioniert mit der NULLEN.

Code: Alles auswählen

foreach i ( `ls -1 Dia*` )
set j2 = `printf "%.4d" $j`
echo $i "--> Dia-$j2.jpg"
Hier fehlt aber das Inkrementieren. Wo wird $j geaendert?

Diese Umsetzung in csh scheint es so zu machen, wie ich vorgeschlagen habe: mit normalen Zahlen zu rechnen ($j) und nur fuer die Ausgabe die Nullen vorne dran hangen ($j2). Deine bash-Umsetzung rechnet aber mit fuehrenden Nullen (was mittels des bash-Features `10#' allerdings auch zu gehen scheint).

Loesungswege, die ich sehe:
- Mach es in der Bash strukturell gleich wie in der Csh.
- Nutze die Bash-Features, die dir vorgeschlagen worden sind.
- Bleibe bei der Csh, wenn die tut. (Warum muss es unbedingt in der Bash sein?)


Edit: Oh, zu spaet, owl102 war schneller. ;-)
Use ed once in a while!

gosseberry
Beiträge: 15
Registriert: 02.10.2017 08:54:54

Re: bash-script addition mit führenden Nullen

Beitrag von gosseberry » 01.03.2018 10:20:29

Meillo hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 09:38:29
gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 09:11:25
owl102 hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 19:54:03
Und bitte ändere

Code: Alles auswählen

for i in `ls -1 Dia*`
nach

Code: Alles auswählen

for i in Dia*
(Siehe auch: http://mywiki.wooledge.org/ParsingLs )
Danke für die Anregungen, aber das hatte ich auch schon; es gibt hier auch mehrere Syntax.
Dieser Hinweis ist aber wichtig und mehr als eine Nebensaechlichkeit, das betrifft auch dein Beispiel in der csh! Gerade in dem Fall gibt es auch keinen Grund, der dagegen spricht: Es ist nicht nur sicherer, sondern auch noch performanter und einfacher verstaendlich und weniger Code!

Okay, das aber alles liefert mir keine Lösung meiner Frage.
Zum Vergleich in der csh sieht es sehr einfach aus und es funktioniert mit der NULLEN.

Code: Alles auswählen

foreach i ( `ls -1 Dia*` )
set j2 = `printf "%.4d" $j`
echo $i "--> Dia-$j2.jpg"
Hier fehlt aber das Inkrementieren. Wo wird $j geaendert?

Diese Umsetzung in csh scheint es so zu machen, wie ich vorgeschlagen habe: mit normalen Zahlen zu rechnen ($j) und nur fuer die Ausgabe die Nullen vorne dran hangen ($j2). Deine bash-Umsetzung rechnet aber mit fuehrenden Nullen (was mittels des bash-Features `10#' allerdings auch zu gehen scheint).

Loesungswege, die ich sehe:
- Mach es in der Bash strukturell gleich wie in der Csh.
- Nutze die Bash-Features, die dir vorgeschlagen worden sind.
- Bleibe bei der Csh, wenn die tut. (Warum muss es unbedingt in der Bash sein?)


Edit: Oh, zu spaet, owl102 war schneller. ;-)
sorry, hatte ich vergessen :(
@ j = $j + $l
und @ kennt bash nicht

So, ich habe noch einen Fehler bei mir entdeckt; Ich hatte die variable start als "typeset - i start" noch definiert; Aber nun habe ich noch die Herausforderung, dass

Code: Alles auswählen

start=$(printf "%04d" $((10#$start + $intervall)))
ja das Format "%04d" statisch ist und meine start variablen flexibel --> ergo ist start=000000001 wird immer nur "%04d" ausgedruckt.

Aber ich bin schon etwas weiter. Vielleicht gibt es noch einen Tipp - Danke

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

Re: bash-script addition mit führenden Nullen

Beitrag von Meillo » 01.03.2018 10:37:20

gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 10:20:29
ja das Format "%04d" statisch ist und meine start variablen flexibel --> ergo ist start=000000001 wird immer nur "%04d" ausgedruckt.

Aber ich bin schon etwas weiter. Vielleicht gibt es noch einen Tipp - Danke
Sowas in der Art vielleicht:

Code: Alles auswählen

digits="$(echo "$start" | wc -c)"  # Anzahl der Stellen rausfinden
start="$(expr "$start" + 0)"       # Fuehrende Nullen entfernen

...

printf "%0${digits}d" ...          # gewuenschte Anzahl von Stellen ausgeben
Use ed once in a while!

owl102

Re: bash-script addition mit führenden Nullen

Beitrag von owl102 » 01.03.2018 11:01:58

gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 10:20:29
@ j = $j + $l

Code: Alles auswählen

j=$((j+l))
Vielleicht gibt es noch einen Tipp - Danke
Es würde IMHO helfen, wenn wir die Aufgabenstellung in Prosa bekommen, anstatt Codeschnipsel.

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

Re: bash-script addition mit führenden Nullen

Beitrag von Meillo » 01.03.2018 11:12:15

Btw: Besser als

Code: Alles auswählen

printf "%0${digits}d" "$j"
ist

Code: Alles auswählen

printf "%0*d" "$digits" "$j"
... ist mir gerade noch eingefallen.
Use ed once in a while!

gosseberry
Beiträge: 15
Registriert: 02.10.2017 08:54:54

Re: bash-script addition mit führenden Nullen

Beitrag von gosseberry » 01.03.2018 12:13:58

owl102 hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 11:01:58
gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 10:20:29
@ j = $j + $l

Code: Alles auswählen

j=$((j+l))
Vielleicht gibt es noch einen Tipp - Danke
Es würde IMHO helfen, wenn wir die Aufgabenstellung in Prosa bekommen, anstatt Codeschnipsel.
Okay, bevor wir uns hier im Kreis drehen. Mein sehr kleines csh-Programm nummeriert die Dias neu, wobei ich den Startwert und den Intervall festlege.
Nicht mehr und nicht weniger. Das Programm sortiert die Dias neu - fertig u.g. csh-script macht das.

Code: Alles auswählen

#!/bin/csh
echo -n "Start Untere Schranke :"
@ j = $<
echo -n "Intervall :"
@ l = $<
set WORKING_DIR = /xyz
cd $WORKING_DIR

foreach i ( `ls -1 Dia*` )
set j2 = `printf "%.4d" $j`
echo $i "--> Dia-$j2.jpg"
mv $i Dia-$j2.jpg
@ j = $j + $l
end
Hintergrund: Migration zum bash-script. Ziel u.a. auch bash-script Programmierung zu verstehen. Z.Zt. sieht mein bash-script so aus:

Code: Alles auswählen

#!/bin/bash 

read -p "Start Untere Schranke; Start Number (0001) : " start
read -p "Intervall : " intervall

workingDir="/xyz"
cd ${workingDir}

for i in $(ls -1 Dia*)
	do
		j=$(printf '%.4s' $i)
		echo $i "-->" $j$start.jpg
#		mv "$i --> $j$start.jpg"
 		start=$(printf "%05d" $((10#$start + $intervall)))
 		# sol nix anderes sein als @ j = $j + $l in der csh
	done
Und die Ergebnis sind ja bekannt - s.u.
Start Untere Schranke; Start Number (0001) : 001
Intervall : 1
Dia-0001.jpg --> Dia-001.jpg
Dia-0002.jpg --> Dia-00002.jpg
Dia-0003.jpg --> Dia-00003.jpg
...

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

Re: bash-script addition mit führenden Nullen

Beitrag von Meillo » 01.03.2018 12:41:40

gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 12:13:58
Dia-0001.jpg --> Dia-001.jpg
Dia-0002.jpg --> Dia-00002.jpg
Darum sollte man eben nicht alles ineinander verwursteln. Trenne die Berechnung von der Ausgabeformatierung. Schaffe Klarheit. Arbeite Schritt fuer Schritt. Dafuer habe ich Vorschlaege gemacht.

Die fortgeschrittenen Techniken, die die Bash-Profis hier vorgeschlagen haben, sind in deinem konkreten Fall, wo es dir um das Verstaednis der Programmierung von Bourne-kompatiblen Shells zur Csh geht, wohl mehr irritierend als hilfreich. Ich glaube, dass es dir am meisten helfen wird, die einzelnen Arbeitsschritte einen nach dem anderen und klar getrennt abzuarbeiten.

Schreibe zuerst dein Programm ganz fertig *ohne* fuehrende Nullen. Wenn das vollstaendig laeuft, dann erst baue die fuehrenden Nullen *bei der Ausgabe* ein.


Edit: Du kannst deinen Code aber auch retten, indem du meinen Vorschlag zur Anzahl der Zeichen auf `%05d' anwendest. Schoen wird der Code dann immer noch nicht sein, aber zumindest deinen Anforderungen nach funktionieren.
Use ed once in a while!

gosseberry
Beiträge: 15
Registriert: 02.10.2017 08:54:54

Re: bash-script addition mit führenden Nullen

Beitrag von gosseberry » 01.03.2018 13:32:18

Meillo hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 12:41:40
gosseberry hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 12:13:58
Dia-0001.jpg --> Dia-001.jpg
Dia-0002.jpg --> Dia-00002.jpg
Darum sollte man eben nicht alles ineinander verwursteln. Trenne die Berechnung von der Ausgabeformatierung. Schaffe Klarheit. Arbeite Schritt fuer Schritt. Dafuer habe ich Vorschlaege gemacht.

Die fortgeschrittenen Techniken, die die Bash-Profis hier vorgeschlagen haben, sind in deinem konkreten Fall, wo es dir um das Verstaednis der Programmierung von Bourne-kompatiblen Shells zur Csh geht, wohl mehr irritierend als hilfreich. Ich glaube, dass es dir am meisten helfen wird, die einzelnen Arbeitsschritte einen nach dem anderen und klar getrennt abzuarbeiten.

Schreibe zuerst dein Programm ganz fertig *ohne* fuehrende Nullen. Wenn das vollstaendig laeuft, dann erst baue die fuehrenden Nullen *bei der Ausgabe* ein.


Edit: Du kannst deinen Code aber auch retten, indem du meinen Vorschlag zur Anzahl der Zeichen auf `%05d' anwendest. Schoen wird der Code dann immer noch nicht sein, aber zumindest deinen Anforderungen nach funktionieren.
Danke für die Tipps/Bemerkungen. Aber das script ohne führende Nullen läuft ja schon lange auch in der bash-shell und das war ja dann eigentlich auch nicht meine Frage. Okay, ich schließe das Thema und schau mal. Lösungen wird es geben.

Danke an alle

Antworten