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.»


Ответ на: комментарий от smh

> The subscript is treated as an arithmetic expression that must evaluate to a number greater than or equal to zero."

Судя по всему он foo и foo1 просто evaluateтид в 0.

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

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

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

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

>По-честному если, хэшей зело не хватает в баше; хотя, с другой стороны, если они начинают требоваться, то возможно самое время посмотреть на другие языки (перл, например), 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
()
Ответ на: комментарий от anonymous4

> Еще как умеет.
> % typeset -A foo

Баш такое умеет, но видимо, очень недавно. Наверное, с четвёртой версии.

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

Here we go

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

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

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

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

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

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

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

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

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

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 ★★★★★
()
Ответ на: комментарий от dilmah

пример работы.  Допустим нужно напечатать слова присутствующие в файле 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 ★★★★★
()
Ответ на: комментарий от dilmah

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

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

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

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

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

dilmah ★★★★★
()

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

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

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

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