Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: 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:
for i in {1..10} ; do mkdir $i ; done
Kuinka tuo 10 korvataan muuttujalla? Jos kirjoitan:
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.
-
Minä käytän komentoa seq
edit: jäi tuo muuttujan asetus pois...
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.
-
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}.
-
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:
i=5
if [ ${#i} -lt 2 ]; then i=0$i; echo $i; fi
tai
i=5
while [ ${#i} -lt 3 ]; do i=0$i; done
echo $i
-
i=7
n=$(printf %3.3d $i)
echo $n
http://wiki.bash-hackers.org/commands/builtin/printf
-
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:
loppu=10
for (( i=1; i<=$loppu; i++)); do mkdir $i; done
Halutessaan voi määrittää myös alun muuttujalla:
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:
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:
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:
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