Di recente mi sono imbattuto in un problemino minchione: avere una sequenza di numeri in ordine inverso (cioè non da 1 a 20 ma da 20 a 1). Fin qui tutto easy.

Di solito se devo avere una sequenza uso appunto seq:

$ seq 1 10

Che stampa appunto i numeri da 1 a 10.
Il problema è che il contrario non mi funzionava.

$ seq 10 1

Nada.

Comunque, mentre cogitavo su questo e quello, e mentre mischiavo seq con sort mi sono imbattuto in una finezza bash che non conoscevo: la brace expansion.

Le brace expansion permettono di creare un output multiplo:

sim@idrogeno:~$ echo {Zio,Gastone}Paperone
ZioPaperone GastonePaperone

In effetti anche:

sim@idrogeno:~$ echo {20..1}
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

e

sim@idrogeno:~$ echo 0{1..20}
01 02 03 04 05 06 07 08 09 010 011 012 013 014 015 016 017 018 019 020

Inoltre si possono creare più concatenazioni:

sim@idrogeno:~$ for stringa in {A..C}{1..3}{x..z}; do echo -n "$stringa "; done
A1x A1y A1z A2x A2y A2z A3x A3y A3z B1x B1y B1z B2x B2y B2z B3x B3y B3z C1x C1y C1z C2x C2y C2z C3x C3y C3z

Perchè possono risultare comode?
Beh, ad esempio, come spiegato nella pagina linkata, per questo:

sim@idrogeno:~$ ls /usr/lib/perl{5,/5.10}/Data/
/usr/lib/perl/5.10/Data/:
Dumper.pm

/usr/lib/perl5/Data/:
Alias.pm

o questo

sim@idrogeno:~$ mkdir -v tmp/{test,a,z}
mkdir: created directory ‘tmp/test’
mkdir: created directory ‘tmp/a’
mkdir: created directory ‘tmp/z’

sim@idrogeno:~$ rmdir -v tmp/{test,a,z}
rmdir: removing directory, ‘tmp/test’
rmdir: removing directory, ‘tmp/a’
rmdir: removing directory, ‘tmp/z’

;-)


Per la cronaca, seq “alla rovescia” non mi funzionava perchè non avevo letto bene il manuale.
La sintassi di seq è semplice:

$ seq [OPTION] LAST
$ seq [OPTION] FIRST LAST
$ seq [OPTION] FIRST INCREMENT LAST

Se FIRST o INCREMENT sono omessi, di default prendono il valore 1. Come si può capire facilmente, quindi seq 10 1 non ha senso. (Ah, fra le opzioni c’e’ –format che permette di stampare con dei placeholder stile printf.)

Quindi per avere quello che voglio è necessario usare:

$ seq 10 -1 1

Con sort:

$ seq 1 20 | sort -rn
# Attenzione, è diverso da seq 1 20 | sort -r

Con tac (il contrario di cat):

$ seq 1 20 | tac


1 Comment to “Bash brace expansion”


  1. Simotrone — 30 May 2010 @ 5:43 pm

    Altro materiale:
    http://hanekomu.at/blog/dev/20100528-1012-bash_brace_expansion.html



Write a comment


You need tologin.

    
SIMOTRONE WEB PAGE is based on WordPress platform, RSS tech , RSS comments design by Gx3.