سؤال

كيف يمكنني الحصول على مصفوفة ترابطية من سلسلة استعلام في Bash؟- محاولة:

#!/usr/bin/env bash

# Querystring (implementation stolen from http://stackoverflow.com/q/3919755)

function populate_querystring_array ()
{
    param="$1"
    query_dict="$2"
    #for i in "${array[@]}"; do IFS="=" ; set -- $i; query_dict[$1]=$2; done

    for ((i=0; i<${#param[@]}; i+=2))
    do
        query_dict[${param[i]}]=${param[i+1]}
    done
}

q0='email=foo@bar.com&password=dfsa54'
declare -A querydict
populate_querystring_array "$q0" "$querydict"
printf "$querydict[email]"
هل كانت مفيدة؟

المحلول

أدناه يجب أن تعمل:

giveacodicetagpre.

Explanation:

im باستخدام مزيج من أوامر AWK لتقسيم السلسلة إلى السجلات الفردية أولا، ثم قم بتقسيمه على= تسجيل الدخول إلى زوج KV.

أنا أستخدم استبدال العملية هنا خلاف ذلك سأكون ملء نسخة من الصفيف.

تحرير:

باستخدام متغير عالمي إلى صفيف المنزل.

نصائح أخرى

#!/usr/bin/env bash
q0='email=foo@bar.com&password=dfsa54'
declare -A querydict
while IFS== read key value
do
    querydict["$key"]="$value"
done < <(echo "$q0" | sed 's/&/\n/g' )
printf "${querydict[email]}\n"

في ما سبق، 's/&/\n/g' هو sed الأمر الذي يحل محل كل حدوث & مع خط جديد.نحن نطبق هذا على q0 بحيث تكون كل مهمة معلمة في سطر منفصل.تتم بعد ذلك قراءة تعيينات المعلمة في ملف while حلقة.لقراءة كل واجب IFS== read key value يستخدم. IFS== يروي read للتعامل مع علامة المساواة كفاصل للكلمات.وهكذا فإن كل مهمة تنقسم إلى كلمتين:الأول هو المفتاح والثاني هو القيمة.ثم يتم تعيينها إلى المصفوفة النقابية querydict مع البيان querydict["$key"]="$value".

وضعها في وظيفة

bash تختلف عن معظم لغات البرمجة الحديثة من حيث أن إمكانياتها في تمرير البيانات المعقدة داخل وخارج الوظائف محدودة للغاية.في الطريقة الموضحة أدناه، المصفوفة النقابية، querydict, ، هو متغير عالمي:

#!/usr/bin/env bash
declare -A querydict
populate_querystring_array () {
    query="$1"
    while IFS== read arg value
    do 
        querydict["$arg"]="$value"
    done < <(echo "$query" | sed 's/&/\n/g' )
}

q0='email=foo@bar.com&password=dfsa54'
populate_querystring_array "$q0"
printf "${querydict[email]}\n"

أخذ إجابة @ John1024 التي أستخدمها في وظيفة تقوم بإرجاع الصفيف المنشأ حسب القيمة، ما عليك سوى طباعة المحتويات باستخدام بناء جملة الصفيف:

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top