Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: K-Veikko - 14.02.14 - klo:19.39

Otsikko: Muuttuja bash -komentotulkissa
Kirjoitti: K-Veikko - 14.02.14 - klo:19.39
Minulla on skriptissä pätkä, joka tekee halutun määrän hakemistoja 1,2,3,... Esimerkiksi 10:

Koodia: [Valitse]
for i in {1..10} ; do mkdir $i ; done
Kuinka tuo 10 korvataan muuttujalla? Jos kirjoitan:

Koodia: [Valitse]
SIVUMAARA=`djvused book.djvu -e 'n'` ;\
for i in {1..$SIVUMAARA} ;\
do mkdir $i ; done

niin saan aikaiseksi vain yhden hakemiston, jonka nimi on:
"{1..10}"

Joten tuo `djvused book.djvu -e 'n'` näyttäisi kyllä toimivan ja antavan $SIVUMAARA'n arvoksi haluamani 10.
Otsikko: Vs: Muuttuja bash -komentotulkissa
Kirjoitti: jekku - 14.02.14 - klo:20.03
Minä käytän komentoa seq
edit: jäi tuo muuttujan asetus pois...

Koodia: [Valitse]

jekku@kone25:~$ SIVUMAARA=11
jekku@kone25:~$ for i in $(seq 1 $SIVUMAARA); do echo $i; done
1
2
3
4
5
6
7
8
9
10
11
jekku@kone25:~$


Kai tuon echon tilalla voi käyttää komentoa mkdir.
Otsikko: Vs: Muuttuja bash -komentotulkissa
Kirjoitti: K-Veikko - 14.02.14 - klo:20.51
for i in $(seq 1 $SIVUMAARA); do echo $i; done

Kiitos.

Olin juuttunut tuohon piste-piste -versioon, koska siinä voi kätevästi määritellä etunollat luvuille.
Esim: {001..100}.
Otsikko: Vs: Muuttuja bash -komentotulkissa
Kirjoitti: jekku - 15.02.14 - klo:03.26
for i in $(seq 1 $SIVUMAARA); do echo $i; done

Kiitos.

Olin juuttunut tuohon piste-piste -versioon, koska siinä voi kätevästi määritellä etunollat luvuille.
Esim: {001..100}.

Tutustupa tuohonkin:

Koodia: [Valitse]

i=5
if [ ${#i} -lt 2 ]; then i=0$i; echo $i; fi


tai

Koodia: [Valitse]

i=5
while [ ${#i} -lt 3 ]; do i=0$i; done
echo $i


Otsikko: Vs: Muuttuja bash -komentotulkissa
Kirjoitti: nm - 15.02.14 - klo:03.52
Koodia: [Valitse]
i=7
n=$(printf %3.3d $i)
echo $n

http://wiki.bash-hackers.org/commands/builtin/printf
Otsikko: Vs: Muuttuja bash -komentotulkissa
Kirjoitti: ajaaskel - 05.03.14 - klo:19.52
Tuo aaltosulku ei taivu tuohon tarkoitukseen (vaikka eval: in avulla tuota voi joskus kiertää)

http://wiki.bash-hackers.org/syntax/expansion/brace (http://wiki.bash-hackers.org/syntax/expansion/brace)

mutta itse käyttäisin uudempaa C-tyyppistä syntaksia:
Koodia: [Valitse]
loppu=10
for (( i=1; i<=$loppu; i++)); do mkdir $i; done

Halutessaan voi määrittää myös alun muuttujalla:
Koodia: [Valitse]
alku=1
loppu=10
for (( i=$alku; i<=$loppu; i++)); do mkdir $i; done

Testauksen ajan tuossa lienee mukavampi käyttää "echo $i" niin näkee heti tuloksen:
Koodia: [Valitse]
alku=1; loppu=10
for (( i=$alku; i<=$loppu; i++)); do echo $i; done
1
2
3
4
5
6
7
8
9
10

Tuli mieleen että halusit noita etunollia...

Muutetaan tuota hieman sillä "printf" tekee niitä aika kätevästi:

Koodia: [Valitse]
alku=1; loppu=10
for (( i=$alku; i<=$loppu; i++)); do printf "%05d\n" ${i}; done
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010

Tuolla tuo numero "5" ennen pientä D-kirjainta on se kentän pituus.

Jos haluat tuon nimisiä hakemistoja niin vaikka näin:

Koodia: [Valitse]
alku=1; loppu=10; for (( i=$alku; i<=$loppu; i++)); do mkdir $(printf "%05d\n" ${i}); done
ls
00001  00002  00003  00004  00005  00006  00007  00008 00009  00010