LINUX.ORG.RU
ФорумAdmin

как в bash скрипте менять порядковый номер переменной


0

1

Есть такой скрипт:

#!/bin/bash

adr="192.168.99.103"

i=1
per=0

while [ $i -lt 11 ]
 do
   ping -c 1 $adr &> /dev/null
   perr$i=$?
   per=$[ $per + $perr$i ]
   i=$[ $i + 1 ]
done

echo $per

При исполнении выдаёт что:

perr1=1: команда не найдена perr2=1: команда не найдена perr3=1: команда не найдена perr4=1: команда не найдена perr5=1: команда не найдена

и т. д.

Это ругань на строку: per$i=$?

Как то раньше писал скрипт по очистке пронумерованных каталогов - например dir1, dir2, dir3

так вот в цикле при работе с каталогами подстановка dir$i работала нормально, а вот с переменными выдаёт ошибки.

Мсходя из справочника по bash испробовал множество вариантов: perr${i}, {perr${i}} и т. д. но безрезультатно.

Подскажите пожалуйста как организовать изменение порядкового номера переменной.

В моём случае можно проблему решить проще - не менять порядковый номер, а просто взять переменную perr и всё, тогда всё работает. Но всё таки хотелось бы узнать как организовывается изменение порядкового номера переменной.

Прошу строго не ругать. За помощь заранее благодарен!

★★

Ман bash arrays

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

твой вопрос решается через eval

А правильнее — через массивы, как уже сказали.

ТС:

addr=127.0.0.1
exit_statuses=()
sum=0

for ((i = 0; i < 11; i++ )); do
    ping -c 1 $addr &>/dev/null
    exit_statuses[$i]=$?
    sum=$((sum + exit_statuses[$i]))
done

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

я ответил на вопрос, а как правильно суммировать коды возврата совсем другая задача и массивы там не нужны.

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

Да, и sum будет больше нуля, если хоть один пинг сломался.

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

Я пытался следовать логике примера ТС, а там каждый exit код «сохранятеся» в переменную perrN

Если просто выяснить что хоть один да упал, то можно проще:

failed=false
for i in $(seq 1 10); do
    ping -c 1 $addr || failed=true
done

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

Я пытался следовать логике примера ТС

Нет, ты пытался сделать по-своему. Если бы ТС спросил как сохранять результаты — тогда да массив, а он спросил как делать двойную подстановку (substitution) переменных — это eval (вторая подстановка)

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

он спросил как делать двойную подстановку (substitution) переменных

Это не конечная задача.

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

Если бы ТС спросил как сохранять результаты

Так а накой ему переменные вида perrN кроме как для сохранения статуса выхода N-ой команды?

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

А что в принципе сооружаете?

Проверку на работоспособность сервера.

Спасибо всем кто помогал, всё получилось. Теперь возникла другая проблема, её изложил в другом посте.

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