Использование функций карты в сценарии оболочки

У меня ниже shellscript

MYMAP12=$(java -jar hello-0.0.1-SNAPSHOT.jar)
echo  "== = "
echo ${MYMAP12}

Результатом java -jar hello-0.0.1-SNAPSHOT.jar будет карта {one=one, two=two, three=three}. как получить каждый элемент из ключа в сценарии оболочки

Я попробовал echo ${MYMAP12{one}}, но у меня возникла ошибка

В лучшем случае программа на Java выводит что-то, предназначенное для другого потребителя. В худшем случае он просто выводит бессмысленный псевдокод. Либо измените hello-0.0.1-SNAPSHOT для вывода того, что использует bashможет, либо используйте программу Java из среды, в которой может анализирует вывод.

chepner 24.08.2018 19:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
2 557
2

Ответы 2

если вы измените формат вывода на правую сторону

$ x = "( [one]=foo [two]=bar [three]=baz )"

тогда вы можете использовать ассоциативные массивы bash

$ declare -A map = "$x"
$ echo "${map[one]}"
foo

Как подразумевает @chepner, код Java просто выводит текстовую строку, которую нужно проанализировать и обработать в bash, чтобы сделать ее полезной. Несомненно, есть несколько способов сделать это, вот тот, который использует чистый bash (т.е. без внешних программ):

# This is the text string supplied by Java
MYMAP12='{one=one, two=two, three=three}'

# Create an associative array called 'map'
declare -A map

# Remove first and last characters ( { and } )
MYMAP12=${MYMAP12#?}
MYMAP12=${MYMAP12%?}
# Remove ,
MYMAP12=${MYMAP12//,/}

# The list is now delimited by spaces, the default in a shell
for item in $MYMAP12
do
    # This splits around '='
    IFS='=' read key val <<< $item
    map[$key]=$val
done

echo "keys: ${!map[@]}"
echo "values: ${map[@]}"

Дает:

keys: two three one
values: two three one

Обновлено:

Вы должны использовать правильный инструмент для работы, если вам нужен ассоциативный массив (карта, хеш-таблица, словарь), тогда вам нужен язык с этой функцией. К ним относятся bash, ksh, awk, perl, ruby, python и C++.

Вы можете извлечь ключи и значения с помощью оболочки POSIX (sh), но вы не можете хранить их в ассоциативном массиве, поскольку sh не имеет этой функции. Лучшее, что вы можете сделать, - это общий список, который представляет собой просто текстовую строку, состоящую из значений, разделенных пробелами. Что вы можете сделать, так это написать функцию поиска, которая ее эмулирует:

get_value() {
    map = "$1"
    key = "$2"

    for pair in $MYMAP12
    do  
        if [ "$key" = "${pair%=*}" ]
        then
            value = "${pair#*=}"
            # Remove last character ( , or } )
            value=${value%?}
            echo "$value"
            return 0
        fi
    done

    return 1
}

MYMAP12='{kone=one, ktwo=two, kthree=three}'

# Remove first character ( { )
MYMAP12=${MYMAP12#?}

val=$(get_value "$MYMAP12" "ktwo")
echo "value for 'ktwo' is $val"

Дает:

value for 'ktwo' is two

С помощью этой функции вы также можете проверить наличие ключа, например:

if get_value "$MYMAP12" "kfour"
then
    echo "key kfour exists"
else
    echo "key kfour does not exist"
fi

Дает:

key kfour does not exist

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

Я хотел сделать это в Shell, я получаю сообщение об ошибке при объявлении карты -A при использовании этого в сценарии оболочки. Вероятно, приведенный выше код находится в bash.

Ganesh 25.08.2018 05:35

Пожалуйста, дайте сообщение об ошибке. Я использовал bash, потому что у вас есть тег bash в вашем вопросе. Обратите внимание, что мой ответ гласит «чистый баш». Пожалуйста, определите, что вы имеете в виду под «оболочкой», что является общим термином. Если вы имеете в виду, что хотите использовать sh (оболочка POSIX), то вам не повезло, поскольку sh не поддерживает ассоциативные массивы.

cdarke 25.08.2018 09:12

Другие вопросы по теме