Kirjoittaja Aihe: Muuttuja bash -komentotulkissa  (Luettu 2600 kertaa)

K-Veikko

  • Käyttäjä
  • Viestejä: 309
    • Profiili
Muuttuja bash -komentotulkissa
« : 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.

jekku

  • Käyttäjä
  • Viestejä: 2624
    • Profiili
Vs: Muuttuja bash -komentotulkissa
« Vastaus #1 : 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.
« Viimeksi muokattu: 14.02.14 - klo:20.06 kirjoittanut jekku »

K-Veikko

  • Käyttäjä
  • Viestejä: 309
    • Profiili
Vs: Muuttuja bash -komentotulkissa
« Vastaus #2 : 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}.

jekku

  • Käyttäjä
  • Viestejä: 2624
    • Profiili
Vs: Muuttuja bash -komentotulkissa
« Vastaus #3 : 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



nm

  • Käyttäjä
  • Viestejä: 16418
    • Profiili
Vs: Muuttuja bash -komentotulkissa
« Vastaus #4 : 15.02.14 - klo:03.52 »

ajaaskel

  • Palvelimen ylläpitäjä
  • Käyttäjä
  • Viestejä: 3401
    • Profiili
Vs: Muuttuja bash -komentotulkissa
« Vastaus #5 : 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

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
« Viimeksi muokattu: 05.03.14 - klo:20.31 kirjoittanut ajaaskel »
Autamme ilolla ja ilmaiseksi omalla ajallamme.  Ethän vaadi, uhoa tai isottele näin saamasi palvelun johdosta.