2009-05-06 13 views
7

Il mio codiceString interpolazione in Bash

#!/bin/bash 
for ((c=0; c<=1127; c++)) 
do 
id = 9694 + c 
if (id < 10000); then 
    wget http://myurl.de/source/image/08_05_27_0${id}.jpg 
else 
    wget http://myurl.de/source/image/08_05_27_${id}.jpg 
fi 
done 

ho solo

./get.sh: line 5: 10000: No such file or directory 
--2009-05-06 11:20:36-- http://myurl.de/source/image/08_05_27_.jpg 

senza il numero.

Il codice corretto:

#!/bin/bash 
for ((c=0; c<=1127; c++)) 
do 
id=$((9694+c)) 
if (id -lt 10000); then 
    wget http://myurl.de/source/image/08_05_27_0${id}.jpg 
else 
    wget http://myurl.de/source/image/08_05_27_${id}.jpg 
fi 
done 

E ancora meglio:

for i in $(seq 9694 10821) ; do 
    _U=`printf "http://myurl.de/source/image/08_05_27_%05d.jpg" $i` 
    wget $_U 
done 
+0

Spero albrecht-haag.de non ti dispiace ti raschiare ogni immagine sul loro sito; -) –

+1

Io lavoro per lui quindi credo che sia ok. =) – ByteNirvana

+0

Qual è la domanda? – innaM

risposta

12

te lo optare per la soluzione più semplice

for i in $(seq 9694 10821) ; do 
    _U=`printf "http://myurl.de/source/image/08_05_27_%05d.jpg" $i` 
    wget $_U 
done 
+0

aggiunge anche lo 0 iniziale? – ByteNirvana

+1

Sì. Usando% 05d come argomento di formulazione per printf, questo caussa printf all'output del pad sinistro con gli zeri – greg

+0

Questa è una risposta migliore rispetto agli altri (sì, shock horror, anche il mio :-). Upvoting. – paxdiablo

1

devi:

id=$((9694+c)) 
... 
if [[ id < 10000 ]]; then 
2

Questo è quello che vi serve.

#!/bin/bash 
for ((c=0; c<=1127; c++)) 
do 
    ((id = 9694 + c)) 
    if [[ id -lt 10000 ]] ; then 
     wget http://myurl.de/source/image/08_05_27_0${id}.jpg 
    else 
     wget http://myurl.de/source/image/08_05_27_${id}.jpg 
    fi 
done 
+0

Hmm, hai modificato la tua risposta, la (()) mancava dalla linea di assegnazione nella versione originale. –

+0

Giusto per chiarire, il codice ora funziona correttamente. E ho fatto il taglio del tuo codice originale, l'ho eseguito e non ha funzionato. –

8

si stanno facendo un paio di errori con la sintassi bash, soprattutto quando si tratta di espressioni aritmetiche.

  • Non è possibile inserire uno spazio intorno al segno = quando si assegna a una variabile.
  • Nell'assegnazione a "id", per richiamare la valutazione aritmetica, è necessario utilizzare la sintassi $ ((espressione)).
  • Per la condizione "se", è necessaria una parentesi doppia, proprio come si usa con "for".

Questo dovrebbe funzionare:

#!/bin/bash 
for ((c=0; c<=1127; c++)); do 
    id=$((9694 + c)) 
    if ((id < 10000)); then 
    wget http://myurl.de/source/image/08_05_27_0${id}.jpg 
    else 
    wget http://myurl.de/source/image/08_05_27_${id}.jpg 
    fi 
done 
+0

Perché il downvote? –

+2

buona spiegazione. – bendin