2009-05-06 16 views
7

Mi códigointerpolación de cadenas en 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 

solo me dan

./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 

sin el número.

El código corregido:

#!/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 

Y aún mejor:

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

espero albrecht-haag.de no importa que raspar cada imagen fuera de su sitio web; -) –

+1

Yo trabajo para él, así que supongo que está bien. =) – ByteNirvana

+0

¿Cuál es la pregunta? – innaM

Respuesta

12

voy a optar por la solución más simple

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

¿esto agrega el 0 principal también? – ByteNirvana

+1

Sí. Al usar% 05d como argumento de formateo para printf, eso causa que printf pase a la salida del panel izquierdo con ceros – greg

+0

Esta es una mejor respuesta que las demás (sí, shock horror, incluso la mía :-). Voto ascendente. – paxdiablo

1

que necesita:

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

Esto es lo que necesita.

#!/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, ha editado su respuesta, la (()) faltaba alrededor de la línea de asignación en la versión original. –

+0

Solo para dejarlo en claro, el código ahora está bien y funciona. Y corté el código original, lo ejecuté y no funcionó. –

8

Usted está haciendo un par de errores de sintaxis con bash, especialmente cuando se trata de expresiones aritméticas.

  • No se puede poner un espacio alrededor del signo = cuando se asigna a una variable.
  • En la asignación a "id", para invocar la evaluación aritmética, debe usar la sintaxis $ ((expresión)).
  • Para la condición "si", necesita doble paréntesis al igual que está usando con "para".

Esto debería funcionar:

#!/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

¿Por qué el voto a favor? –

+2

buena explicación. – bendin

Cuestiones relacionadas