"Как передбрать все эементы массива в bash?"

Аватар пользователя THE_Beginner

Доброго времени суток! Изучаю программирование в bash
Возник вопрос, как перебрать все эллементы массива?
Пример:

#!/bin/bash

index=0

vopros[1]="111"
vopros[2]="222"
vopros[3]="333"
vopros[4]="444"
vopros[5]="555"

vop_ar=${#vopros[*]}

while [ "$index" -lt "$vop_ar" ]
do
index=`expr $index + 1`
echo "${vopros[*]}"
done

Такая схема вроде не прокатывает.. ((

Дальше должно быть так;

if элеммент массива совпадает со значением введеным с коавиатуры
then
то-то то-то
elif
then
то-то то-то
else :
fi

Подскажите как реализовать...? Я не волшебник я только учусь...
Заранее, спасибо!

Аватар пользователя DRVTiny

"Как передбрать все эементы массива в bash?"

Вы спрашивали? Отвечаем:

a[1]=hjhj
a[2]=jjkjk
for ((i=1; i<=${#a[*]}; i++)); do
echo ${a[$i]}
done

Улыбка

Аватар пользователя ks

Re: "Как передбрать все эементы массива в bash?"

Как вариант:

for item in "${vopros[@]}"; do
    echo $item
done

Аватар пользователя THE_Beginner

Re: "Как передбрать все эементы массива в bash?"

Спасибо! Очень помогли!
И еще если не затруднит...
Не подскажите как добавить элемент в массив?

P.S. Читаю книжку "Unix Linux программирование на shell"
А в ней про массивы ничего не сказано... Книжка 2001 г. Из и-нета скачал...

Спасибо щаранее!

Аватар пользователя ks

Re: "Как передбрать все эементы массива в bash?"

Цитата:
как добавить элемент в массив?

Очень просто:

ARR=( 0 1 2 3 4 )
for ((i=0; i<${#ARR[@]}; i++)); do echo ${ARR[$i]}; done

# добавляем пятерку в конец массива 
ARR=( "${ARR[@]}" 5 )
echo ${ARR[5]}

Аватар пользователя ks

Re: "Как передбрать все эементы массива в bash?"

Цитата:
Читаю книжку "Unix Linux программирование на shell"
А в ней про массивы ничего не сказано...

В info bash глава "6.7 Arrays" находится в разделе "Bash Features - Features found only in Bash".
В принципе, массивы есть не только в bash. Как минимум, в ksh и zsh они тоже есть (тем более,
что массивы были содраны из ksh). Видимо, автор info имел в виду, что их нет в стандарте Улыбка

Аватар пользователя THE_Beginner

Re: "Как передбрать все эементы массива в bash?"

Подскажите пожалуцса, есть в Bash какая нибудь рандомная функция?
Поясняю, чтоб выводила Произвольное число из определенного интервала, апример от 1 до 10...
Заранее огромное спасибо!

Аватар пользователя THE_Beginner

Re: "Как передбрать все эементы массива в bash?"

Спасибо!
Вот такая задачка:

#!/bin/bash

questions[1]=111
questions[2]=222
questions[3]=333
questions[4]=444

read CMD

element_count=${#questions[*]}

for ((X=0; X<=${#questions[*]}; X++)); do

if [ "`$element_count`" = "$X" -a "$CMD" != "${questions[$X]}" ]; then
echo "$CMD" >> questions.fl
fi

done

Перевожу:
Есть массив:
Просматриваем элементы массиво циклом, далше...
Если последний элемент массива questions[$X] не равен $CMD, то, ЗАПИСАТЬ значение переменной $CMD в файл questions.fl

Но программка при любом раскладе записывает значение переменной в файл questions.fi

Помогие разбраться в чем причина?
Второй день мучаюсь... ((

Огромное спасибо всем!

Аватар пользователя IsakovAN

Re: "Как передбрать все эементы массива в bash?"

Анекдот напомнило. "А зачем, порутчик, они головы бреют? - Э-э-э... Дикари!"
Зачем цикл, если проверяеться последний элемент?
Во-первых, проверку на равенства CMD и элемента массива я бы вынес за цикл.
Во вторых, вдумайтесь в то что вы здесь написали: "`$element_count`"
1. $element_count=некое число
2. `$element_count`="No such file or directory!" в stderr и "" в stdout
3. "`$element_count`"=""
Правильно будет использовать "$element_count"

P.S. Вам не кажеться, что значение ${#questions[*]} вы вычисляете 1+${#questions[*]} раз, что являеться ${#questions[*]} раз избыточным?! Катается от смеха

Аватар пользователя THE_Beginner

Re: "Как передбрать все эементы массива в bash?"

Извиняюсь! Я не указал полностью стоящую перед мной задачу, которая звучит следующим образом:
Имеется два массива (одинаковые позиционные элементы этих массивов связаны).
В командной строке я вожу выражение (какое-то слово), программа сравнивает введенное мною слово с элементами первого массива. Если это слово совпадает с одним из элементов первого массива, то она выдает элемент второго массива порядковый номер которого совпадает с порядковым номером первого массива. В противном случае слово введенное в командной строке должно записаться в первый массив!

Аватар пользователя THE_Beginner

Re: "Как передбрать все эементы массива в bash?"

Спасибо за помощь! Задачу решил! )

Аватар пользователя IsakovAN

Re: "Как передбрать все эементы массива в bash?"

Предлагаю другой подход:
Создаём файл database.dbf
В него заносим:
question[1]:answer[1]
question[2]:answer[2]
question[3]:answer[3]
...
Скрипт:
result=$( grep ^$CMD: -n database.dbf )
n=${result%%:*}
answer="${result##*:}"
if [ -z "$n" ];then
echo "$CMD:Empty" >> database.dbf
else
echo "$answer"
fi

Аватар пользователя THE_Beginner

Re: "Как передбрать все эементы массива в bash?"

Спасибо за вариант решения задачи! Я в Bash`e новичок, поэтому хотелось бы узнать, что в строках:
n=${result%%:*} и answer="${result##*:}, озачают символы %%:* и ##*

Прошу прошения за незначительный для вас вопрос, но всеже...
Спасибо!

Аватар пользователя ks

Re: "Как передбрать все эементы массива в bash?"

Цитата:
хотелось бы узнать, что в строках:
n=${result%%:*} и answer="${result##*:}, озачают символы %%:* и ##*

Это экспансия параметров
man bash | col -b | sed -ne '/Parameter Exp/,/Command Subst/p' | less

Аватар пользователя IsakovAN

Re: "Как передбрать все эементы массива в bash?"

ks писал(а):
man bash | col -b | sed -ne '/Parameter Exp/,/Command Subst/p' | less

Шайтан арба!!! Я в восхищении! Какой solution! Улыбка

RSS-материал