জ্যাশিতে ব্যাশ ভেরিয়েবল পাস হচ্ছে


119

এ থেকে নির্দিষ্ট মান পুনরুদ্ধার করার জন্য আমি একটি স্ক্রিপ্ট লিখেছি file.json। আমি যদি জিকিউ-র মান সরবরাহ করি তবে এটি কাজ করে তবে selectভেরিয়েবলটি কাজ করে না বলে মনে হয় (বা আমি এটি কীভাবে ব্যবহার করব তা জানি না)।

#!/bin/sh

#this works ***
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="myemail@hotmail.com") | .id')
echo "$projectID"

EMAILID=myemail@hotmail.com

#this does not work *** no value is printed
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="$EMAILID") | .id')
echo "$projectID"

একজন সংশ্লিষ্ট ইস্যু: jq ফিল্টার থেকে ব্যাশ পরিবর্তনশীল ক্ষণস্থায়ী কিছুটা ভিন্ন সিনট্যাক্স হয়েছে jq -r --arg var "$var" '.[$var]' stackoverflow.com/questions/34745451/...
enharmonic

উত্তর:


197

শেল ভেরিয়েবল (EMAILID) কে জিকিউ ভেরিয়েবল হিসাবে পাস করার বিষয়টিও বিবেচনা করুন (উদাহরণের স্বার্থে এখানে ইমেলও রয়েছে):

   projectID=$(cat file.json | 
     jq -r --arg EMAILID "$EMAILID" '
        .resource[]
        | select(.username==$EMAILID) 
        | .id')

পোস্টস্ক্রিপ্ট

রেকর্ডের জন্য, আরেকটি সম্ভাবনা হ'ল envপরিবেশের ভেরিয়েবলগুলি অ্যাক্সেস করার জন্য জেউ এর ফাংশন ব্যবহার করা। উদাহরণস্বরূপ, bash কমান্ডের এই ক্রমটি বিবেচনা করুন:

EMAILID=foo@bar.com  # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'

আউটপুটটি একটি জেএসএন স্ট্রিং:

"foo@bar.com"

4
এটিই কেবলমাত্র 100% - নিরাপদ উত্তর; এটি jqফিল্টার হিসাবে ব্যাখ্যা করে bashএমন স্ট্রিং তৈরির চেয়ে মানটি ব্যবহার করে ফিল্টারটি সঠিকভাবে তৈরি করতে দেয় jq। (তা বিবেচনা কিছু ঘটে তাহলে এর মান EMAILIDএকটি রয়েছে )।)
chepner

4
ধন্যবাদ শিখর। আপনার সরবরাহিত সমাধানটি আমি যথাযথ প্রতিক্রিয়াটি খুঁজছিলাম। হ্যাঁ এটা কাজ করে.
asidd

আমার ব্যবহারের ক্ষেত্রে, এটি কাজ করে! function n2 { termux-contact-list |jq -r --arg v1 "$1" '.[] | select(.name==$v1)|.number' }কলিং:n2 Name1
টিমো

4
fyi, jq এর envফাংশনটি jq 1.4 এবং 1.5+ এর মধ্যে পরিবর্তিত হয়, সুতরাং উল্লেখ env.EMAILID(এই উত্তরটির উদাহরণে) jq 1.4 এ কাজ করে না, সুতরাং আপনি jq 1.4 ব্যবহার করার --arg EMAILID "$EMAILID"প্রয়োজন হলে কনস্ট্রাক্ট ব্যবহার করার পরামর্শ দিচ্ছেন। আশাকরি এটা সাহায্য করবে; নিজের জন্য এটি বের করার জন্য আমাকে কেবল একটি দিন সময় নিয়েছে;)
m0j0hn

4
ব্যবহার করে পাস করা যুক্তিগুলি --argস্ট্রিং হিসাবে পাস করা হবে। আপনি যদি কোনও আলাদা জেএসওএন টাইপের ডেটা পাস করতে চান তবে ব্যবহার করুন --argjson, যা স্ট্রিংটিকে জেএসওএন হিসাবে পার্স করবে যেমন,--argjson myObj '{"a": [1, 2]}'
বলপয়েন্টবেন

27

আমি অভ্যন্তরীণ ডাবল উদ্ধৃতিগুলি এড়িয়ে এই সমস্যাটি সমাধান করেছি

projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")

আমি এটি ব্যবহার করছি কারণ --arg এটির সাথে ভাল খেলছে না-c
দিমিত্রিস মোরাইটিডিস

8

এটি একটি উদ্ধৃতি ইস্যু, আপনার প্রয়োজন:

projectID=$(
  cat file.json | jq -r ".resource[] | select(.username=='$EMAILID') | .id"
)

যদি আপনি মূল স্ট্রিংটি সীমিত করতে একক উদ্ধৃতিগুলি রাখেন , শেলটি $EMAILIDআক্ষরিকভাবে নেয় ।

"ডাবল উদ্ধৃতি" প্রত্যেক আক্ষরিক যে স্পেস / metacharacters এবং ধারণ করে যে সম্প্রসারণ: "$var", "$(command "$var")", "${array[@]}", "a & b"। ব্যবহার করুন 'single quotes'কোড বা আক্ষরিক জন্য $'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'। দেখুন
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words


পাশাপাশি আমার ক্ষেত্রে ত্রুটি, যদি অনুরূপ এ সব কোট ব্যবহার না: termux-contact-list |jq -r '.[] | select(.name=='$1')|.number'। ফলাফল:jq Compile error
টিমো

6
আমি নিশ্চিত নই কেন এই মন্তব্যটি এতবার ভোট দেওয়া হয়েছে; হ্যাঁ, ডাবল উক্তি পরিবর্তনশীল প্রসারণের অনুমতি দেয় তবে jqএকক উদ্ধৃতি পছন্দ করে না:jq: error: syntax error, unexpected INVALID_CHARACTER (Unix shell quoting issues?)
জেদেলম্যান

যদি আপনার ইনপুটটি নিয়মিত জসন হয় তবে এর মানগুলি দ্বিগুণ হবে (একক নয়)। কী কাজ করে: জ্যাকির পুরো আর্গ জন্য ডাবল কোটস ব্যবহার করে এবং এসিডের উত্তর মতো, এর মধ্যে যে কোনও ডাবল কোট (`\` সহ) এর মধ্যে পাল্টে যাওয়া।
গুসুকু

7

এটি অন্যদের সহায়তা করতে পারে হিসাবে এখানে পোস্ট করা। স্ট্রিংয়ে এটি জেউ-তে কোটগুলি পাস করার প্রয়োজন হতে পারে। JQ সহ নিম্নলিখিতগুলি করতে:

.items[] | select(.name=="string")

ব্যাশ আপনি করতে পারে

EMAILID=$1
projectID=$(cat file.json | jq -r '.resource[] | select(.username=='\"$EMAILID\"') | .id')

মূলত উদ্ধৃতিগুলি এড়ানো এবং এটিকে জিকিউ-তে প্রেরণ করা


পুরোপুরি কাজ করে। দ্রুত সমাধান খুঁজছেন এমন কারও পক্ষে খুব জটিল নয়।
গডফ্রে

4

এটি সম্পাদন করার আরেকটি উপায় হ'ল জকি "--আরজি" পতাকাটি। আসল উদাহরণ ব্যবহার করে:

#!/bin/sh

#this works ***
projectID=$(cat file.json | jq -r '.resource[] | 
select(.username=="myemail@hotmail.com") | .id')
echo "$projectID"

EMAILID=myemail@hotmail.com

# Use --arg to pass the variable to jq. This should work:
projectID=$(cat file.json | jq --arg EMAILID $EMAILID -r '.resource[] 
| select(.username=="$EMAILID") | .id')
echo "$projectID"

এখানে দেখুন, আমি কোথায় এই সমাধানটি পেয়েছি: https://github.com/stedolan/jq/issues/626


2

আমি জানি কিছুটা পরে উত্তর দেওয়ার জন্য, দুঃখিত। তবে এটি আমার পক্ষে কাজ করে।

export K8S_public_load_balancer_url="$(kubectl get services -n ${TENANT}-production -o wide | grep "ingress-nginx-internal$" | awk '{print $4}')"

এবং এখন আমি ভেরিয়েবলের সামগ্রীটি জিকিউ-তে আনতে এবং পাস করতে সক্ষম হয়েছি

export TF_VAR_public_load_balancer_url="$(aws elbv2 describe-load-balancers --region eu-west-1 | jq -r '.LoadBalancers[] | select (.DNSName == "'$K8S_public_load_balancer_url'") | .LoadBalancerArn')"

আমার ক্ষেত্রে পরিবর্তনশীল মানটি অ্যাক্সেস করার জন্য আমার ডাবল উদ্ধৃতি এবং উদ্ধৃতি ব্যবহার করা দরকার।

চিয়ার্স


1

পরিবেশের ভেরিয়েবলগুলি অ্যাক্সেস করার জন্য এখন জেকিউয়ের আরও ভাল উপায় রয়েছে, আপনি env ব্যবহার করতে পারেন MAIL

projectID=$(cat file.json | jq -r ".resource[] | select(.username==env.EMAILID) | .id")

1

সামান্য সম্পর্কিত নয় তবে আমি এটি এখানে রেখে দেব, অন্যান্য ব্যবহারিক উদ্দেশ্যে শেল ভেরিয়েবলগুলি হিসাবে ব্যবহার করা যেতে পারে -

value=10
jq  '."key" = "'"$value"'"' file.json
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.