ubuntuusers.de

For-Schleife, führende Nullen erzeugen

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

Fanatics

Avatar von Fanatics

Anmeldungsdatum:
25. August 2010

Beiträge: 1032

Hallo Forum,

Ich muss remmina-Dateien erzeugen und habe dafür ein script geschrieben, dass ich mit Hilfe einer for-Schleife aufrufe.

for ((i=1;i<=16;i++)){./create-remmina-files.sh 01-100 ws-$i}

Wie kann ich dafür sorgen, dass $i immer dreistellig (001,016,100) ist?

Danke

Gruß

Fanatics

PS: Ich nutze die z-shell

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21853

Wohnort: Lorchhausen im schönen Rheingau

Bau dir die Shcleife mit den Mitteln der Shell vorher shcon so:

for i in {001..010}; do echo $i;done
001
002
003
004
005
006
007
008
009
010

Fanatics

(Themenstarter)
Avatar von Fanatics

Anmeldungsdatum:
25. August 2010

Beiträge: 1032

Hm...dann muss ich das wohl in der bash aufrufen, die z-shell lässt die Nullen weg, auch bei Deinem Script. Trotzdem danke...

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21853

Wohnort: Lorchhausen im schönen Rheingau

Bei mir nicht:

$ for i in {01..10};do echo $i;done
01
02
03
04
05
06
07
08
09
10
$ echo $SHELL
/bin/zsh

mit einer entsprechenden Shebang wäre das allerdings auch kein Problem 😉

Fanatics

(Themenstarter)
Avatar von Fanatics

Anmeldungsdatum:
25. August 2010

Beiträge: 1032

Liegt vermutlich an meiner zshrc...

  % for i in {01..10};do echo $i;done                                                                                                        :(
1
2
3
4
5
6
7
8
9
10

Hab' mal gesucht und was anderes gefunden, zwar nicht schön, aber funktioniert:

for ((i=0;i<=20;i++)){n=$(printf "%0*d" 3 $i);echo ws-$n}

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Außer dem printf %03i gäbe es noch 2 ähnliche Tricks, mit einer Parameter Expansion:

  1. mit Nullen ergänzen

    1
    2
    3
    4
    for i in {1..12}; do
        i=00$i
        echo ws-${i: -3:3}
    done
    
  2. mit größeren Zahlen

    1
    2
    3
    for i in {1001..1012}; do
        echo ws-${i: -3:3}
    done
    

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

Ich finde ja auch dies recht nett:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ seq 1 100 | xargs printf '%03d\n'
001
002
003
004
005
006
007
008
009
010
011
012
013
...

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

so viele möglichkeiten...

for x in $(seq -w 1 100)

bei 1 bis 16 ist es dann nur zweistellig aber wenn man weiss dass es zweistellig ist kann man ja vielleicht noch selber 0$x schreiben? 😉

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13215

frostschutz schrieb:

so viele möglichkeiten...

Ja, z.B. auch noch

1
seq -w 1 100

Das dürfte so ungefähr das kürzeste sein. ☺ Ansonsten ginge auch noch:

1
seq -f %03.0f 1 100
for x in $(seq -w 1 100)

Das gibt nichts aus.

bei 1 bis 16 ist es dann nur zweistellig aber wenn man weiss dass es zweistellig ist kann man ja vielleicht noch selber 0$x schreiben? 😉

Schon wieder umständlich.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

das do echo $x done kannst dir dazudenken 😉

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Was sagt zsh denn hierzu:

1
2
3
4
5
6
for i in 00{8..9} 0{98..99} 100; do echo $i; done 
008
009
098
099
100

Fanatics

(Themenstarter)
Avatar von Fanatics

Anmeldungsdatum:
25. August 2010

Beiträge: 1032

Da hab' ich ja was losgetreten... 😉

Danke für die Tipps! ☺

Antworten |