Строковая интерполяция в Bash - PullRequest
13 голосов
/ 06 мая 2009

Мой код

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

Я только получаю

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

без номера.

Исправленный код:

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

И еще лучше:

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

Ответы [ 4 ]

16 голосов
/ 06 мая 2009

Я выберу более простое решение

for i in $(seq 9694 10821) ; do
    _U=`printf "http://myurl.de/source/image/08_05_27_%05d.jpg" $i`
    wget $_U 
done
10 голосов
/ 06 мая 2009

Вы делаете пару ошибок с синтаксисом bash, особенно когда имеете дело с арифметическими выражениями.

  • Нельзя ставить пробел вокруг знака = при назначении переменной.
  • В присваивании «id» для вызова арифметической оценки необходимо использовать синтаксис $ ((expression)).
  • Для условия "if" вам нужны двойные скобки, как и в случае с "for".

Это должно работать:

#!/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
3 голосов
/ 06 мая 2009

Это то, что вам нужно.

#!/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
1 голос
/ 06 мая 2009

Вам нужно:

id=$((9694+c))
...
if [[ id < 10000 ]]; then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...