LINUX.ORG.RU

Если мне память не изменяет, то BASH не умеет в именованные (как-их-там-называют) массива. Да и массивом это можно назвать лишь с натяжкой.

r3lgar ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Имхо потому что нет смысла под самые элементарные цели использовать другие языки раз скрипт у меня элементарный. Выяснять ничего не над. Я прошу помощи

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

Sort of magic, конечно, даже перл отдыхает, но вот:

$ cat test.sh 
#!/bin/bash

test="a=b c=d"
declare -A arr
for i in $test ; do
  arr+=([${i%=*}]=${i#*=})
done
echo ${arr[a]}
echo ${arr[c]}

$ ./test.sh
b
d

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

Можно просто сделать в одну строку declare -A arr=($test), но test для этого надо привести к виду [a]=b [c]=d. Но я не придумал как на pure bash так воткнуть квадратные скобки. Чёртов шел не может в backreference. Может кто подскажет?

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

К сожалению не прокатывает. foscamwpa.sh: line 7: «SZS-969»: syntax error: operand expected (error token is «„SZS-969“»)

SZS-969 это то что содержится в ssid

Полное содержание переменной scan_ssid=1 ssid=«SZS-969» psk=«Simon2008»

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

<<<'scan_ssid=1 ssid=«SZS-969» psk=«Simon2008»' - переменная содержит в себе динамически получаемые данные в таком формате, а не статические

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

Ну так замените на свой параметр, делов:

in="scan_ssid=1 ssid=«SZS-969» psk=«Simon2008»"
eval declare -A arr2=($(sed 's/\(\w*\)=\(\w*\)/[\1]=\2/g' <<<$in))

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

Проверяй, что экранируешь правильно. У меня работает:

$ cat test.sh 
#!/bin/bash

test='scan_ssid=1 ssid="SZS-969" psk="Simon2008"'
declare -A arr
for i in $test ; do
  arr+=([${i%=*}]=${i#*=})
done
echo ${arr[*]}

$ ./test.sh
"SZS-969" 1 "Simon2008"

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

redgremlin огромное спасибо Как теперь выводить отдельные значения из массива?

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

Умеет

О, у меня криокамера протекла!

но при этом так умудряется жрать память что лучше бы не умел.

В таком случае будем считать, что не умеет. :3

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

какие-то неправильные выводы

anonymous
()
#!/bin/sh

data="scan_ssid=1 ssid=test_ssid psk=ключ"
for pair in $data; do
	key="${pair%=*}"
	val="${pair#*=}"
	echo "KEY: '${key}', VALUE: '${val}'"
done


#!/bin/sh

data="scan_ssid=1 ssid=test_ssid psk=ключ"
eval "$data"

echo $scan_ssid
echo $ssid

Собственно, и зачем тут целый bash да еще и с массивами ... %)

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

Но вообще, все это сломается как только у тебя в SSID будут пробелы ... :D Если, конечно же, у тебя значения будут без кавычек.

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

Лоркод осиль уже. Сам не видишь, что читать невозможно твои сообщения с кавычками ёлочками?

ashot ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

ТС, внемли этому комментарию. Возьми нормальный ЯП, не используй bash.

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

Пробую вывести элемент массива echo ${arr['psk']} В итоге - пустая строка

#
declare -a ary
#
ary[${#ary[@]}]=whatever1
ary[${#ary[@]}]=whatever2
ary[${#ary[@]}]=whatever3
ary[${#ary[@]}]=whatever4
ary[${#ary[@]}]=whatever5
#
for element in "${ary[@]}"; do
  echo $element;
done
#
#whatever1
#whatever2
#whatever3
#whatever4
#whatever5
#
for element in 1 2 3; do
  echo "${ary[${element}]}";
done
#
#whatever2
#whatever3
#whatever4
#
echo ${ary[0]}
#
#whatever1
#
echo ${ary[1]}
#
#whatever2
#
anonymous
()

Ай да лучше пёрл возьми, если в пистон не умеешь, не насилуй себя. Не надо баш.

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