LINUX.ORG.RU

bash-то оказывается умеет ассоциативные массивы


1

0
$ a[foo]='bar'
$ echo ${a[foo]}
bar
$

И давно так? В мане говорится только про «number greater than or equal to zero»: «An array is created automatically if any variable is assigned to using the syntax name[subscript]=value. The subscript is treated as an arithmetic expression that must evaluate to a number greater than or equal to zero.»


Re: bash-то оказывается умеет ассоциативные массивы

Не умеет. :-)

$ a[foo]='bar'; a[foo1]='bar1'; echo ${a[foo]}
bar1

smh ★★★ ()

Re: bash-то оказывается умеет ассоциативные массивы

Блина, действительно. Меня смутила графа "Hash tables" в таблице сравнения шеллов на Википедии: http://en.wikipedia.org/wiki/Comparison_of_computer_shells

По-честному если, хэшей зело не хватает в баше; хотя, с другой стороны, если они начинают требоваться, то возможно самое время посмотреть на другие языки (перл, например), right?

xio ()

Re: bash-то оказывается умеет ассоциативные массивы

>По-честному если, хэшей зело не хватает в баше; хотя, с другой стороны, если они начинают требоваться, то возможно самое время посмотреть на другие языки (перл, например), right?

Нередко awk хватает :)

KRoN73 ★★★★★ ()

POSIX shell

#!/bin/sh

setel()
{
        eval "${1}_${2}=\"${3}\""
}

getel()
{
        eval "echo \${${1}_${2}}"
}

setel arr foo bar
setel arr boo far
setel arr xyz abyrwalg

getel arr boo
getel arr foo
getel arr xyz

Deleted ()
Ответ на: POSIX shell от Deleted

Re: POSIX shell

Here we go

    __o
  _`\<,_
 (*)/ (*)

xio ()

Re: bash-то оказывается умеет ассоциативные массивы

> Нередко awk хватает

можно держать awk сопроцессом, общаться с ним по именованным пайпам, и хранить в нем ассоц. массив (то есть доступ к элементу в шелле выглядит как вызов функции). Так что, массивы в шелле не нужны(с).

dilmah ★★★★★ ()
Ответ на: POSIX shell от Deleted

Re: POSIX shell

это хуже чем сопроцесс awk, потому что часто нужно присваивать
элементы внутри подшеллов:

cmd1 \
  | cmd2 \
  | cmd3 \
  | while read line; do
      process line
      setel arr xxx
    done

а переменные не передаются из подшелла наружу

dilmah ★★★★★ ()

Re: bash-то оказывается умеет ассоциативные массивы

init_hash_subsystem()
{
  for T in I O; do
    eval ${T}_HASH_PIPE=`mktemp`
    eval export ${T}_HASH_PIPE
    eval rm -f \$${T}_HASH_PIPE
    eval mkfifo \$${T}_HASH_PIPE
  done
  awk -vo_pipe=${O_HASH_PIPE}.locked \
    '($1 == "st") { getline key;
                    getline value;
                    arr[key]=value }
     ($1 == "ld") { printf "" > o_pipe;
                    getline key;
                    print arr[key] > o_pipe;
                    close(o_pipe) }
     ($1 == "qt") { exit }' < $I_HASH_PIPE &
  exec 3>$I_HASH_PIPE
}

hash_lock()
{
  while ! mv $O_HASH_PIPE ${O_HASH_PIPE}.locked 2> /dev/null; do
    true
  done
}

hash_unlock()
{
  mv ${O_HASH_PIPE}.locked $O_HASH_PIPE
}

st_var()
{
  printf "st\n%s\n%s\n" "$1" "$2" >&3
}

ld_var()
{
  echo "ld" >&3
  exec 4<${O_HASH_PIPE}.locked
  printf "%s\n" "$1" >&3
  head -n1 <&4-
}

destroy_hash_subsystem()
{
  echo "qt" >&3-
}

dilmah ★★★★★ ()

Re: bash-то оказывается умеет ассоциативные массивы

пример работы.  Допустим нужно напечатать слова присутствующие в файле words1, но отсутствующие в words2.

init_hash_subsystem
hash_lock
cat words1 | while read -r word; do st_var "$word" 1; done
cat words2 | while read -r word; do test -n "$(ld_var "$word")" || echo "$word"; done

dilmah ★★★★★ ()

Re: bash-то оказывается умеет ассоциативные массивы

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

Шелл-программирование -- оно сейчас скорее живо, чем мертво, или наоборот? И ежели первое, то где-то востребовано "промышленностью"?

xio ()

Re: bash-то оказывается умеет ассоциативные массивы

> И ежели первое, то где-то востребовано "промышленностью"?

Нортел для задач конфигурирования базовых станций использует shell и tcl скрипты, генерирующие другие shell скрипты. Но там корни тянулись лет на 15 назад.

dilmah ★★★★★ ()

Re: ksh-то оказывается умеет ассоциативные массивы

Юзай ksh, там есть. тем более он есть во всех Unix'ax. Потом не придется чесать репу с адаптацией скриптов.

sdio ★★★★★ ()

Re: bash-то оказывается умеет ассоциативные массивы

Мне просто ниша sh не очень очевидна. Выходит, что для всего, кроме скриптов инициализации, да коротких, не более 50 строк поделок на скорую руку, лучше предпочесть что-нибудь более мощное и переносимое (вроде перла)?

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