# [solved] Schleife in Bash mit führenden Nullen

## musv

Hallo, 

wenn man in der Bash eintippt:

```
echo {001..003}
```

bekommt man als Ergebnis:

```
001 002 003
```

Jetzt würde ich die Iterationsangaben gern durch Variablen ersetzen:

```
export $BLUBB="003"

echo {001..$BLUBB}
```

Ausgabe ist dann:

```
{001..003}
```

Wie bekomm ich die gewünschte Iteration hin? Ach ja, die führenden Nullen sind mir wichtig. Ansonsten hätte der Weg über for i in `seq 1 3` funktioniert.Last edited by musv on Sun Sep 11, 2011 5:49 pm; edited 1 time in total

----------

## disi

Das sollte funktionieren:

```
BLUBB=003; seq -s" " -f "%03g" $BLUBB
```

----------

## mv

```
eval "echo {001..$BLUBB}"
```

Aber aufpassen, dass BLUBB wirklich nur Zahlen enthält und nicht zum Exploit führen kann, etwa durch vorheriges Ausführen des folgenden Codes:

```
case "${BLUBB}" in

*[^0-9]*) echo "BLUBB enthält nicht nur Ziffern"; exit 1;;

esac
```

----------

## Knieper

```
>bar=003

>echo {001..${bar}}

001 002 003
```

Allerdings zsh (mir ist immer noch unklar, wieso man die bash einsetzen sollte).

----------

## mv

 *Knieper wrote:*   

> (mir ist immer noch unklar, wieso man die bash einsetzen sollte)

 

Volle Zustimmung: Entweder man will volle POSIX Kompatibilität - dann nimmt man die dash - oder man will Luxus - dann nimmt man die zsh. Ein Verzicht auf Kompatibilität ohne großen Luxusgewinn und dafür mit hohem Verlust an Geschwindigkeit und Speicher ergibt keinen Sinn   :Wink: 

----------

## musv

Hab die Version von disi genommen. Vielen Dank.

Find ich klasse, dass man seq quasi als printf verunstalten kann. Wieder was gelernt.

----------

## Knieper

 *mv wrote:*   

>  *Knieper wrote:*   (mir ist immer noch unklar, wieso man die bash einsetzen sollte) 
> 
> dafür mit hohem Verlust an Geschwindigkeit und Speicher ergibt keinen Sinn  

 

Dash nehme ich nur für portable Skripte und früher mal als login-Shell. Zwischen bash und zsh ist ressourcentechnisch kein wirklicher Unterschied, beide ungefähr 6·dash. Die Zeit, die man mit zsh spart, ist es wert zu wechseln. Noch lieber wäre mir allerdings eine komplette Neuentwicklung, statt dieser Stringschieberei mit inkonsistenten Parametern.

----------

## mv

 *Knieper wrote:*   

> Zwischen bash und zsh ist ressourcentechnisch kein wirklicher Unterschied, beide ungefähr 6·dash.

 

zsh benötigt bei mir nur etwa 70% des Speichers der bash und ist etwa doppelt so schnell (und damit ungefähr so schnell wie die dash):

```
zsh -c "for i in {1..10000}; do true | true; done"  # 1.20s user 3.25s system 57% cpu 7.774 total

bash -c "for i in {1..10000}; do true | true; done" # 1.18s user 6.06s system 45% cpu 15.755 total
```

----------

## Knieper

 *mv wrote:*   

> zsh benötigt bei mir nur etwa 70% des Speichers der bash

 

Bei mir etwas mehr, das ist log'weise konfigurationsabhängig.

 *Quote:*   

> 
> 
> ```
> zsh -c "for i in {1..10000}; do true | true; done"  # 1.20s user 3.25s system 57% cpu 7.774 total
> 
> ...

 

```
0.39s user 2.38s system 50% cpu 5.465 total

0.75s user 4.12s system 24% cpu 19.612 total
```

Solch einen Unterschied hätte ich nicht erwartet...

----------

## musv

 *Knieper wrote:*   

> (mir ist immer noch unklar, wieso man die bash einsetzen sollte)

 

Gewohnheit

 *mv wrote:*   

> Ein Verzicht auf Kompatibilität ohne großen Luxusgewinn und dafür mit hohem Verlust an Geschwindigkeit und Speicher ergibt keinen Sinn  

 

Die Geschwindigkeit spielt bei meinem Script nicht wirklich eine Rolle. Es soll einfach ein paar Dateien zählen und mir die fehlenden Parts ausgeben. Dafür reicht mir auch die Bash. 

Zsh ist installiert. Aber ehrlichgesagt komm ich mit der zsh noch nicht wirklich klar. Hab mich halt an die Bash gewöhnt.

----------

## mv

 *musv wrote:*   

> Die Geschwindigkeit spielt bei meinem Script nicht wirklich eine Rolle.

 

Das ist auch nur ein meist unwesentlicher von vielen anderen Nachteilen - oder sagen wir besser: mangelnden Vorteilen.

 *Quote:*   

> Es soll einfach ein paar Dateien zählen und mir die fehlenden Parts ausgeben. Dafür reicht mir auch die Bash.

 

"Reichen" täte mit Sicherheit auch die dash. Aber gerade so Array-Dinger gehen in der zsh oft mit ein oder zwei Operationen (mit geeigneten Flags), während Du in der Bash händisch verschachtelte Schleifen durchlaufen musst u.ä. - und selbst das nicht so flexibel geht, wie Du hier im Thread gesehen hast, weil die Expansions-Funktionen beschränkter sind.

Und was Gewohnheit betrifft: Außer, dass man sich bewusst sein sollte, dass sich Variablen aus Bash-Sicht automatisch wie Arrays verhalten (wenn Du sie nicht mit ${=VAR} ansprichst), verhält sich die zsh beim Programmieren eigentlich "abwärtskompatibel" zu bash, nur dass man i.W. Zugriff auf viele neue Möglichkeiten hat...

----------

## disi

Ich habe Gestern mal meinen User und Root auf zsh in Gentoo umgestellt. Erstmal muss man eine vernuenftige .zshrc anlegen, damit man z.B. 'End','Home','Del' usw. benutzen kann, einen Alias fuer ls damit Farben angezeigt werden und dann diese tolle Sache eine farbige Gentoo PS1 zu bekommen  :Smile: 

Dann habe ich geguckt und das hier gefunden:

http://zsh.sourceforge.net/FAQ/zshfaq02.html

Da habe ich mich gleich aufgemacht und konnte viele Einstellungen auf meinem FreeBSD csh uebernehmen  :Smile: 

Folgendes funktioniert uebrigends einwandfrei in csh und zsh:

```
alias newcmd 'list of commands'
```

Das Vervollstaendigen von Befehlsoptionen ist schon geil (ich glaube bash hat etwas aehnliches, aber hatte ich nie benutzt).

Ansonsten konnte ich kaum Unterschiede feststellen, habe aber auch nicht viel gemacht ausser Dateien kopiert... die kleinen Skripte die ich gebastelt habe (wie Ordner synchronisieren, Videos umwandeln, Systemoptionen aendern etc.) sind alle sehr simple und da habe ich sowieso #!/bin/sh angegeben.

/bin/sh hatte ich noch auf /bin/dash gelinkt, um zu sehen ob das System noch tut und alle Skripts laufen  :Very Happy: 

Mal guggn...

----------

## mv

 *disi wrote:*   

> Das Vervollstaendigen von Befehlsoptionen ist schon geil (ich glaube bash hat etwas aehnliches, aber hatte ich nie benutzt).

 

Ja, es gibt mittlerweile die bash-completion. Aber die ist schon sehr primitiv, sowohl aus Programmierersicht (beispielsweise müssen die Funktionen grundsätzlich für alle Kommandos in allen Shells geladen werden, weil es das Autoload-Konzept ("Nachladen bei Bedarf") in der bash nicht gibt) als auch aus Anwendersicht: Aus einem Menü auszuwählen statt nur eine Liste zu sehen, ist schon luxuriös. Großer Nachteil der zsh: Die Defaults sind besch...eiden. Man muss alles erst aktivieren. Als kleines Beispiel: In meiner zsh werden bei interaktiven Shells u.a. folgende Kommandos ausgeführt:

```
setopt noautocd autopushd cdablevars nochasedots nochaselinks

setopt pathdirs autonamedirs bashautolist promptsubst

setopt histignorealldups histreduceblanks histverify nohistexpand

setopt extendedglob histsubstpattern

setopt nodotglob nonomatch nonullglob numericglobsort noshglob

setopt mailwarning interactivecomments noclobber

setopt nobgnice nocheckjobs nohup longlistjobs monitor notify printexitvalue

NULLCMD=:

READNULLCMD=less

ttyctl -f

autoload -Uz is-at-least compinit

zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

zstyle ':completion:*' completer _expand _complete _expand_alias

zstyle ':completion:*' menu select=1 # interactive

zstyle ':completion:*' original true

zstyle ':completion:*' remote-access false

zstyle ':completion:*' use-perl true

zstyle ':completion:*' verbose true

zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s

zstyle ':completion:*' accept-exact-dirs true

zstyle ':completion:*' path-completion false

zstyle ':completion:*' squeeze-slashes true

if is-at-least 4.3.10

then   zstyle ':completion:*' format "%B%F{yellow}%K{blue}%d%k%f%b"

else   zstyle ':completion:*' format "%B%d%b"

fi

compinit -D -u
```

Vieles ist natürlich Geschmackssache (gerade die Optionen bitte nicht unverstanden übernehmen: Einige Defaults habe ich Bash-ähnlich gemacht, weil ich mich in einigen Punkten nicht umgewöhnen wollte).

Nur ein Beispiel für dieses Setting "cp [3 x Tab]" - und schon kann man aus einem colorierten Directory-Listing mit Cursortasten die Files auswählen (hoffe ich - ev. benötigt man noch einige "bindkey"-Kommandos dazu, die ich jetzt nicht alle hier kopieren wollte...)

----------

## Necoro

Nett an der zsh (u.a.): VCS-Informationen (zB SVN, hg, bzr, git, ...) im Prompt (Screenshot). Insbesondere für "auf welchem Branch bin ich gerade" und "gibt es uncommittete / nicht indizierte (git) Änderungen" (zB das "*" und das "U" auf dem Screenshot).

For the interested non-googler: Mein dazu benutzter Code:

```
# vcs stuff for prompt

setopt prompt_subst

if [[ $ZSH_VERSION == 4.3.<->* ]]; then

    autoload -Uz vcs_info

    zstyle ":vcs_info:*" enable bzr cvs svn git hg

    zstyle ":vcs_info:*" formats "%B%{$fg[yellow]%}[%{$fg[green]%}(%u%c) %{$fg[yellow]%}%b:%1.7i%f%%b (%s)%B%{$fg[yellow]%}]%f%%b"

    zstyle ":vcs_info:*" branchformat "%b"

    zstyle ":vcs_info:*" get-revision true

    zstyle ":vcs_info:*" check-for-changes true

    zstyle ":vcs_info:*" max-exports 1

    

    # hg stuff

    zstyle ":vcs_info:hg:*" unstagedstr '*'

    zstyle ":vcs_info:hg:*" hgrevformat '%r'

    # bzr stuff

    zstyle ":vcs_info:bzr:*" unstagedstr '*'

    zstyle ":vcs_info:bzr:*" use-simple true

    RPROMPT='${vcs_info_msg_0_:+"${vcs_info_msg_0_} "}'"${RPROMPT}"

else

    vcs_info () {} # dummy

fi

# ...

precmd() 

{

        echo -ne "\033]0;${USER}@$(hostname):${PWD/$HOME/~}\007";

        promptnl

        vcs_info # <-- die einzig wichtige Zeile

}
```

(Mehr ZSH-Anregungen hab ich dort: https://git.necoro.eu/dotfiles.git/tree/.zsh )

----------

## disi

Ich werde da auf jeden Fall mal tiefer einsteigen, danke  :Smile: 

----------

## Yamakuzure

Ja, die zsh ist toll. Nur schade das (schon wieder) ein Thread mit zsh-fan-werbe-blablah zugemüllt wurde. Entschuldigt euch wenigstens beim OP. Völlig egal ob ihr Recht habt, oder nicht. Schon wieder so ein unpassendes Gelaber wie unglaublich schlecht die Bash doch sei (schon klar) nervt. Egal um wie viele Längen die zsh besser ist. Wenn man das, was an der zsh besser ist nicht benötigt, ist es sowas von Wurscht. Und damit einen Thread, in dem es um etwas völlig Anderes geht vollzuschwallern ist einfach extrem unhöflich.

----------

## SkaaliaN

Naja..als Info ist es ja ganz nett. Ansonsten einfach einen ZSH Werbe und Fanthread eröffnen und los gehts !  :Twisted Evil: 

----------

## Knieper

 *Yamakuzure wrote:*   

> Entschuldigt euch wenigstens beim OP.

 

Dh. Du willst aus einem solved-Thema mit Alternativvorschlägen einen Metameckerthread machen? Sehr geistreich.

----------

## mv

 *Yamakuzure wrote:*   

>  Entschuldigt euch wenigstens beim OP. [...] Schon wieder so ein unpassendes Gelaber

 

Entschuldigung? Unpassendes Gelaber? Weil anstelle des von mir vorgeschlagenen Bash-Würgarounds eine funktionierende Lösung ohne Sicherheitsprobleme vorgeschlagen wurde?

 *Quote:*   

> Wenn man das, was an der zsh besser ist nicht benötigt,

 

...dann hat man sehr wenig Erfahrung mit der Shell, und es schadet dann erst recht nicht, eine Shell zu nehmen, in der einfach mehr geht. Im Zweifelsfall besteht der "Verlust" darin, dass man dann eine Shell benutzt, die einfach nur schneller ist.

 *xlayre wrote:*   

> Ansonsten einfach einen ZSH Werbe und Fanthread eröffnen

 

Einen solchen gibt es. Das Problem bei solchen Threads ist aber, dass ihn nur Leute lesen, die die zsh sowieso schon benutzen. Andere Leute (so wie ich früher auch) schauen in einen solchen Thread nicht hinein und stoppseln weiter mit der bash rum, unwissend, dass es viel Besseres gibt. Ich möchte anderen halt den Frust ersparen, den ich nach Jahren Bash hatte, als ich entdeckte, dass die zsh alles gekonnt hätte, was mich gestört hatte, dies aber nur nicht per Default-Konfiguration aktiviert war.

Jetzt wird es aber wirlich OT.   :Wink: 

----------

## SkaaliaN

Ich kann sowieso nicht nachvollziehen, was die ständigen Gnome/KDE, zsh/bash u.s.w. Flamewars bringen sollen. Streitet euch doch nicht über unsinne Kleinigkeiten.

Ich werde die zsh auch mal ausprobieren. Nur weil ich bisher die bash genutzt habe, ist die zsh kein No-Go.

----------

## Knieper

 *xlayre wrote:*   

> Streitet euch doch nicht über unsinne Kleinigkeiten.

 

Hast Du ein anderes Thema gelesen? Hier streitet doch niemand. Es wurde nur eine bessere Lösung propagiert und eine Shell, die einem viel Arbeit abnimmt.

----------

## SkaaliaN

 *Knieper wrote:*   

> Hast Du ein anderes Thema gelesen? Hier streitet doch niemand. Es wurde nur eine bessere Lösung propagiert und eine Shell, die einem viel Arbeit abnimmt.

 

 *Yamakuzure wrote:*   

> Entschuldigt euch wenigstens beim OP. [...] Schon wieder so ein unpassendes Gelaber

 

Der ganze Post war zumindest zänkisch geschrieben. Vielleicht hast du ihn ja auch nur überlesen / nicht ganz gelesen.

----------

