The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как передбрать все эементы массива в bash?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как передбрать все эементы массива в bash?"  
Сообщение от THE_Beginner (ok) on 30-Янв-07, 10:53 
Доброго времени суток! Изучаю программирование в 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

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

Подскажите пожалуйста как сделать?
Заранее, спасибо!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Как передбрать все эементы массива в bash?"  
Сообщение от THE_Beginner (ok) on 30-Янв-07, 11:38 
>Доброго времени суток! Изучаю программирование в 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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Как передбрать все эементы массива в bash?"  
Сообщение от Xela email(ok) on 30-Янв-07, 14:38 
#!/bin/bash

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


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


Обратите внимание на кавычке в for. А вместо предложеного вами
if элеммент массива совпадает со значением введеным с коавиатуры
then
то-то то-то
elif
then
то-то то-то
else :
fi

я бы приспособил case

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Как передбрать все эементы массива в bash?"  
Сообщение от Oyyo on 30-Янв-07, 15:04 
>#!/bin/bash
>
>vopros[1]="111 111"
>vopros[2]="222 222"
>vopros[3]="333 333"
>vopros[4]="444 444"
>vopros[5]="555 555"
>
>
>for i in "${vopros[@]}"; do
>  echo $i
>done

>Обратите внимание на кавычке в for.

тот же  эффект без кавычек
for i in $vopros ; do
  echo $i
done

> А вместо предложеного вами
>if элеммент массива совпадает со значением введеным с коавиатуры
>then
>то-то то-то
>elif
>then
>то-то то-то
>else :
>fi
>
>я бы приспособил case


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Как передбрать все эементы массива в bash?"  
Сообщение от bANAn on 30-Янв-07, 15:11 
>>#!/bin/bash
>>
>>vopros[1]="111 111"
>>vopros[2]="222 222"
>>vopros[3]="333 333"
>>vopros[4]="444 444"
>>vopros[5]="555 555"
>>
>>
>>for i in "${vopros[@]}"; do
>>  echo $i
>>done
>

skolko="${#vopros[*]}"; i="0";
until [ "$skolko" -eq "$i" ]; do
действие
let "i += 1"; done

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Как передбрать все эементы массива в bash?"  
Сообщение от bANAn on 30-Янв-07, 15:12 
кстате http://icmp.ru/man/programming/sh/abs-guide/
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Как передбрать все эементы массива в bash?"  
Сообщение от Xela email(ok) on 30-Янв-07, 15:16 
>тот же  эффект без кавычек
>for i in $vopros ; do
>  echo $i
>done


Ошибаетесь, коллега: выдержка из man bash, раздел Arrays:
       Any element of an array may be referenced using ${name[subscript]}.  The braces are required
       to avoid conflicts with pathname expansion.  If subscript is @ or *, the word expands to all
       members of name.  These subscripts differ only when the word appears within  double  quotes.
       If  the  word  is  double-quoted, ${name[*]} expands to a single word with the value of each
       array member separated by the first character of the IFS special  variable,  and  ${name[@]}
       expands  each  element  of  name  to  a  separate  word.

Да и практика доказывает:
sinitsa@home ~ $ cat test.sh
#!/bin/bash

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


for i in $vopros; do
  echo $i
done
sinitsa@home ~ $ ./test.sh
sinitsa@home ~ $

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Как передбрать все эементы массива в bash?"  
Сообщение от Oyyo on 30-Янв-07, 16:38 
Однако, вот эта конструкция работает
с тем же результатом

#!/bin/bash
vopros=( "111 111 222 222 333 333 444 444 555 555" )
for i in $vopros ; do
  echo $i
done


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Как передбрать все эементы массива в bash?"  
Сообщение от Xela email(ok) on 30-Янв-07, 17:01 
>Однако, вот эта конструкция работает
>с тем же результатом
>
>#!/bin/bash
>vopros=( "111 111 222 222 333 333 444 444 555 555" )
>
>for i in $vopros ; do
>  echo $i
>done

Да, но это несколько другой формат :) Да и в вашем варианте элементом списка не может быть предложение содержащее пробел, в отличии от приведенного мной примера.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Как передбрать все эементы массива в bash?"  
Сообщение от Oyyo on 30-Янв-07, 17:05 
>>Однако, вот эта конструкция работает
>>с тем же результатом
>>
>>#!/bin/bash
>>vopros=( "111 111 222 222 333 333 444 444 555 555" )
>>
>>for i in $vopros ; do
>>  echo $i
>>done
>
>Да, но это несколько другой формат :) Да и в вашем варианте
>элементом списка не может быть предложение содержащее пробел, в отличии от
>приведенного мной примера.

незнаю незнаю, у меня почемуто в обоих
случаях результат одинаков

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Как передбрать все эементы массива в bash?"  
Сообщение от Xela email(ok) on 30-Янв-07, 18:33 
>незнаю незнаю, у меня почемуто в обоих
>случаях результат одинаков

Не знаю, не знаю... Почувствуйте разницу:


sinitsa@home ~ $ cat test.sh
#!/bin/bash

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


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

vopros=( "111 111 222 222 333 333 444 444 '555 555'" )

for i in $vopros ; do
  echo $i
done
sinitsa@home ~ $ ./test.sh
111 111
222 222
333 333
444 444
555 555
111
111
222
222
333
333
444
444
'555
555'
sinitsa@home ~ $

Стоит однако отметить, что еще важно в этом случае значение IFS. У меня -- дефолт = пробел, таб, перенос строки(если не изменяет память).


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Как передбрать все эементы массива в bash?"  
Сообщение от Oyyo on 30-Янв-07, 18:54 
>Стоит однако отметить, что еще важно в этом случае значение IFS. У
>меня -- дефолт = пробел, таб, перенос строки(если не изменяет память).
>
результат:
[root@localhost /]# ./test.sh
111 111
222 222
333 333
444 444
555 555

получается только в том случае, если дефолтное значение IFS
изменить, убрав пробел как разделитель

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "Как передбрать все эементы массива в bash?"  
Сообщение от Xela email(ok) on 30-Янв-07, 19:00 
>>Стоит однако отметить, что еще важно в этом случае значение IFS. У
>>меня -- дефолт = пробел, таб, перенос строки(если не изменяет память).
>>
>результат:
>[root@localhost /]# ./test.sh
>111 111
>222 222
>333 333
>444 444
>555 555
>
>получается только в том случае, если дефолтное значение IFS
>изменить, убрав пробел как разделитель


Вот! И я о том же. :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "Как передбрать все эементы массива в bash?"  
Сообщение от bANAn on 30-Янв-07, 20:33 
а чего вы с разделителми мучаетесь?
есть простой и верный способ обратиться к
конкретному элементу массива - у него же есть номер.
ну а со считалкой перебор по номерам - самое милое дело!
дописал свой примерчег чтоб понятней было.

skolko="${#vopros[*]}"; i="0";
until [ "$skolko" -eq "$i" ]; do
действие с участием ${vopros[i]}
let "i += 1"; done

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "Как передбрать все эементы массива в bash?"  
Сообщение от Oyyo on 30-Янв-07, 21:24 
>а чего вы с разделителми мучаетесь?
>есть простой и верный способ обратиться к
>конкретному элементу массива - у него же есть номер.
>ну а со считалкой перебор по номерам - самое милое дело!
>дописал свой примерчег чтоб понятней было.
>
>skolko="${#vopros[*]}"; i="0";
>until [ "$skolko" -eq "$i" ]; do
>действие с участием ${vopros[i]}
>let "i += 1"; done

c номерами верно, но выше приведённый пример
теряет последний "5" элемент массива т.к.
первый с индексом "0" неопределён

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

вобщем, автор вопроса так и молчит,
а мы тут дискутируем незная исходных
элементов и как строится массив.
всё пора заканчивать.....

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру