LINUX.ORG.RU

Счетчик в цикле while не меняет значение

 


0

2

Здравствуйте! Подскажите, пожалуйста, почему счетчик не меняет свое значение после команды let INDEX++ ?

Сам скрипт:

#!/bin/sh
#Скрипт рекурсивно ограничивает все картинки по большей стороне.
#Запускать из корневой папки с картинками: resizer.sh

find ./ -name "*.jpg" -or -name "*.JPG" > names_temp.txt

COUNT=$(wc -l names_temp.txt | awk '{print $1}') #общее число картинок
INDEX=1

cat names_temp.txt | while read file
do
 echo "Обработка файла `basename ${file}` $INDEX из $COUNT" #здесь счетчик всегда показывает число 1
 convert "${file}" -resize "2500x2500>" -compress JPEG2000 -quality 95 "${file}"
 let INDEX++
done

echo "Все изображения обработаны"

rm ./names_temp.txt

★★

Ответ на: комментарий от int13h

Я перепробовал кучу вариантов, при форме записи let «INDEX+=1» счётчик также стоит на месте

rmu ★★
() автор топика
Ответ на: комментарий от rmu

откуда ты это знаешь? я не вижу ни одной команды, которая бы выводила значение этой пемеренной

anonymous
()
Ответ на: комментарий от rmu

В смысле с такими кавычками ""

rmu ★★
() автор топика
Ответ на: комментарий от rmu

У меня твой скрипт нормально работает. Может, на месте /bin/sh у тебя действительно sh, а не bash?

mix_mix ★★★★★
()
Ответ на: комментарий от rmu
pinkbyte@phantom ~ $ sh 1.sh 
1
2
3
4
^C
pinkbyte@phantom ~ $ cat 1.sh 
#!/bin/bash
while true; do
let INDEX=$INDEX+1
echo $INDEX
sleep 1
done

Может потому что у тебя в выражении фигня, которую bash не понимает?

И да, плюсую вышеотписавшихся ораторов насчет /bin/bash в качестве shebang

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Встроенная команда let вычисляет значение арифметического выражения <EXPRESSION> и возвращает его код возврата
0 (TRUE) когда <EXPRESSION> не равняется 0 (arithmetic “true”)
1 (FALSE) когда <EXPRESSION> равняется 0 (arithmetic “false”)

код возврата
let INDEX=$INDEX+1

я не понимать..

JK
()

cat names_temp.txt | while read file

Сабпроцесс же тут

Так надо:

while ...
...
done < names_temp.txt

anonymous
()
Ответ на: комментарий от JK

и возвращает его код возврата

google://код возврата

подсказка - $?

вычисляет значение арифметического выражения

бинго!

Читаем http://www.opennet.ru/docs/RUS/bash_scripting_guide/c5358.html(поиск по «Команда let») до просветления

Кстати я был немного не прав - $INDEX не нужен, хватило бы просто INDEX, судя по примерам

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)

разве bash знает записи типа i++? по моему тут тебе не диснейленд, пиши как
splinter@bastile:~$ i=$(($i+1))
splinter@bastile:~$ i=$(($i+1)); echo $i

splinter ★★★★★
()
Последнее исправление: splinter (всего исправлений: 1)
Ответ на: комментарий от splinter

man bash

ARITHMETIC EVALUATION
       The shell allows arithmetic expressions to be evaluated, under  certain
       circumstances  (see the let and declare builtin commands and Arithmetic
       Expansion).  Evaluation is done in fixed-width integers with  no  check
       for  overflow, though division by 0 is trapped and flagged as an error.
       The operators and their precedence, associativity, and values  are  the
       same  as in the C language.  The following list of operators is grouped
       into levels of equal-precedence operators.  The levels  are  listed  in
       order of decreasing precedence.

       id++ id--
              variable post-increment and post-decrement
       ++id --id
              variable pre-increment and pre-decrement

anonymous
()
Ответ на: комментарий от Pinkbyte

я знаю что такое код возврата. (: смутило

0 (TRUE) когда <EXPRESSION> не равняется 0 (arithmetic “true”)
1 (FALSE) когда <EXPRESSION> равняется 0 (arithmetic “false”)

должно же 0 или 1 вернуть?!? просвети, где я туплю.

JK
()
Ответ на: комментарий от Pinkbyte

всё. не утруждай себя ответами я понял где я лох. (:

JK
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.