У меня ниже 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}}, но у меня возникла ошибка




если вы измените формат вывода на правую сторону
$ 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.
Пожалуйста, дайте сообщение об ошибке. Я использовал bash, потому что у вас есть тег bash в вашем вопросе. Обратите внимание, что мой ответ гласит «чистый баш». Пожалуйста, определите, что вы имеете в виду под «оболочкой», что является общим термином. Если вы имеете в виду, что хотите использовать sh (оболочка POSIX), то вам не повезло, поскольку sh не поддерживает ассоциативные массивы.
В лучшем случае программа на Java выводит что-то, предназначенное для другого потребителя. В худшем случае он просто выводит бессмысленный псевдокод. Либо измените
hello-0.0.1-SNAPSHOTдля вывода того, что используетbashможет, либо используйте программу Java из среды, в которой может анализирует вывод.