Использование функциональности карты в сценарии оболочки - PullRequest
0 голосов
/ 24 августа 2018

У меня ниже шеллскрипт

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

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

Я пытался echo ${MYMAP12{one}}, но он выдал ошибку

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Как подразумевает @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

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

0 голосов
/ 24 августа 2018

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

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

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

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