বাশ সহ কোনও অ্যারের শেষ উপাদানটি পড়ার কোনও উপায় আছে?


68

যদি আমার 5 টি উপাদান সহ একটি অ্যারে থাকে, উদাহরণস্বরূপ:

[a][b][c][d][e]

ব্যবহার করে echo ${myarray[4]}আমি এটি ধারণ করে দেখতে পারি।

তবে যদি আমি প্রদত্ত অ্যারেতে উপাদানগুলির সংখ্যা জানতাম না? অজানা দৈর্ঘ্যের অ্যারের শেষ উপাদানটি পড়ার কোনও উপায় আছে? অর্থ্যাৎ কোন অ্যারের জন্য ডান থেকে বামে প্রথম উপাদান পড়া?

আমি কীভাবে এটি ব্যাশে করব তা জানতে চাই।


$@ঠিক কোন অ্যারে নয় (সাবস্ক্রিপশন করা যাবে না)। এটির জন্য, শেল স্ক্রিপ্টে শেষ আর্গুমেন্টটি প্রাপ্ত হওয়া দেখুন
টম হেল

উত্তর:


89

আপনি শেষ উপাদানটি পেতে কেবলমাত্র একটি নেতিবাচক সূচক ব্যবহার করতে পারেন ${myarray[-1]}। আপনি দ্বিতীয়-শেষের জন্য একই জিনিস করতে পারেন, এবং আরও; বাশে:

যদি সূচকযুক্ত অ্যারের কোনও উপাদানকে রেফারেন্স করতে ব্যবহৃত সাবস্ক্রিপ্ট শূন্যের চেয়ে কম সংখ্যায় মূল্যায়ন করে, তবে এটি অ্যারের সর্বাধিক সূচকের চেয়ে বড় হিসাবে সম্পর্কিত হিসাবে ব্যাখ্যা করা হয়, সুতরাং নেতিবাচক সূচকগুলি অ্যারের শেষ থেকে পিছনে গণনা করে এবং একটি -1 এর সূচক শেষ উপাদানকে বোঝায়।

একই কাজ জন্য কাজ করে। যখন এটি "এক্সপ্রেশন" বলে তখন এর অর্থ সত্যই একটি অভিব্যক্তি; আপনি সূচিটি গণনা করতে সেখানে যে কোনও গাণিতিক প্রকাশে লিখতে পারেন, অ্যারেটির দৈর্ঘ্য ${#myarray[@]}স্পষ্টভাবে ব্যবহার করে গণনা করে including


2
আপনি এটি kshএবং zshপাশাপাশি করতে পারেন ।
জ্যানিস

5
সঙ্গে zshযদিও, ডিফল্ট অ্যারে 1-ইন্ডেক্স, অসদৃশ bashএবং ksh0-ইন্ডেক্স তারা কোথায়।
স্টিফেন কিট

2
হ্যা অবশ্যই; এই প্রশ্নের সংক্ষিপ্ত উত্তর পরিবর্তিত হয় না, তবে দীর্ঘ ফর্মটির উল্লেখ করার পরে আমি সেখানে আচরণের পার্থক্যটি চিহ্নিত করা জরুরি বলে মনে করেছি।
স্টিফেন কিট

22
Gণাত্মক সূচকগুলি কেবলমাত্র 4.3 বা তার উপরে বাশে কাজ করে।
cuonglm

10
কমপক্ষে v10.11.5 হিসাবে ম্যাক ওএস এক্স এর সাথে অন্তর্ভুক্ত ব্যাশের সংস্করণটি কেবলমাত্র 3.2, সুতরাং এটি ম্যাকগুলিতে কাজ করে না।
ডক্টর জে

44

আধুনিক ব্যাশ (v4.1 বা আরও ভাল)

আপনি সূচীতে শেষ উপাদানটি পড়তে পারেন -1:

$ a=(a b c d e f)
$ echo ${a[-1]}
f

Negativeণাত্মক সূচী ব্যবহার করে শেষ থেকে সংখ্যা-সূচকযুক্ত অ্যারে অ্যাক্সেসের জন্য সমর্থন বাশ সংস্করণ 4.1-আলফা দিয়ে শুরু হয়েছিল

পুরানো বাশ (v4.0 বা তার আগের)

${#a[@]}শেষ উপাদানটি পেতে আপনাকে অবশ্যই অ্যারের দৈর্ঘ্য পেতে হবে এবং তারপরে একটিটি বিয়োগ করতে হবে:

$ echo ${a[${#a[@]}-1]}
f

যেহেতু বাশ অ্যারে সাবস্ক্রিপ্টগুলিকে পাটিগণিতের বহিঃপ্রকাশ হিসাবে বিবেচনা করে, তাই অতিরিক্ত অঙ্কের প্রয়োজন নেই, যেমন $((...))পাটিগণিত মূল্যায়নকে বাধ্য করার জন্য।


শেষটি আমার পক্ষে কাজ করে না; আমি ব্যাশ v4.1.2 (1) ব্যবহার করছি: শেষ আইটেমটি মুদ্রণের পরিবর্তে এটি পুরো অ্যারেটি প্রিন্ট করে।
আলেকজ মাগুরা

@ কিউংলমের উত্তরগুলি অবশ্য কার্যকর হয়।
আলেকজ মাগুরা

উত্তরটি আরও ভাল হবে যদি আপনি modernকোনও সংস্করণে যোগ্যতা অর্জন করতে পারেন ।
সামভিন

1
ঠিক হ'ল অ্যাঞ্জারকে নিখুঁত করার জন্য যা প্রয়োজন ছিল।
সামভিন

1
এই জন্য আপনাকে ধন্যবাদ. আমি প্রতিধ্বনি using {a [$ (($ {# a [@]} - 1])) ব্যবহার করছিলাম} কারণ আমি "বাশ ট্রিট অ্যারে সাবস্ক্রিপ্টগুলিকে একটি পাটিগণিত প্রকাশ হিসাবে" সম্পর্কে জানতাম না।
ব্রুনো ব্রোনোস্কি

15

bashঅ্যারে অ্যাসাইনমেন্ট, রেফারেন্স, নেতিবাচক সূচকের সাথে সেট না করা কেবল ব্যাশ ৪.৩ এ যোগ করা হয়েছিল । এর পুরানো সংস্করণ সহ bash, আপনি সূচীতে প্রকাশটি ব্যবহার করতে পারেনarray[${#array[@]-1}]

অন্য উপায়, bash(বাশ 3.0.০ বা আরও ভাল) এর পুরানো সংস্করণেও কাজ করুন :

$ a=([a] [b] [c] [d] [e])
$ printf %s\\n "${a[@]:(-1)}"
[e]

বা:

$ printf %s\\n "${a[@]: -1}"
[e]

নেতিবাচক অফসেট ব্যবহার করে, আপনি আলাদা করতে প্রয়োজন :সঙ্গে -সঙ্গে গুলিয়ে ফেলা হচ্ছে এড়াতে :-সম্প্রসারণ।


1
এটি তৈরি করুন "${a[@]: -1}"এবং এটি (পাশাপাশি bashএবং zsh) কাজ করবে ksh
জানিস

কর্নশেল ডক্স ( www2.research.att.com/sw/download/man/man1/ksh.html ) এটি সম্পূর্ণরূপে নির্দিষ্ট করে। ( zshবা এর ডক্সটি পরীক্ষা করে দেখেনি bash; তবে আমি এটি তিনটি শেলের মধ্যেই পরীক্ষা করেছি))
জ্যানিস

@ জ্যানিস: বাশ ডকুমেন্টেশন পুনরায় পড়ুন, এটি এটি সম্পর্কেও উল্লেখ করেছে। আবার ধন্যবাদ.
cuonglm

4

বিন্যাস

ব্যাশের মধ্যে প্রাচীনতম বিকল্পগুলি (যেহেতু বাশ 3.0.০++) হ'ল:

$ a=(aa bb cc dd ee)
$ echo "${a[@]:(-1)}   ${a[@]: -1}   ${a[@]:(~0)}   ${a[@]:~0}"
ee   ee   ee   ee

(ডিফল্ট মান ব্যবহার করুন) এর বিস্তৃতি হিসাবে :একটি বিয়োগের অনুসরণের ব্যাখ্যা এড়াতে স্থানটির প্রয়োজন space-"${var:-abc}"

~একটি গাণিতিক হয় , bitwise অস্বীকৃতি (এক সম্পূরক সমতূল্য বা সমস্ত বিট টুসকি )। ম্যান বাশ থেকে:

শিল্প মূল্যায়ন

      ! ~         logical and bitwise negation  

যেহেতু বাশ -২.২ + +:

$ echo "${a[-1]}   ${a[(~0)]}"
ee   ee

যেহেতু বাশ 5.0+ এছাড়াও:

$ echo "${a[~0]}"
ee

সমস্ত বাশ সংস্করণের জন্য (পুরানো বাশ):

$ echo "${a[   ${#a[@]}-1   ]}"    # spaces added **only** for readability
ee

@

অবস্থানগত আর্গুমেন্টের জন্য (বাশ ২.০১ থেকে):

$ set aa bb cc dd ee
$ echo "${@:(-1)} ${@:~0} ${@: -1} ${@:$#}   ${!#}"
ee ee ee   ee

সমস্ত শাঁসের জন্য বহনযোগ্য সমাধান হ'ল ইওল ব্যবহার করা:

eval printf '"%s\n"' \"\${$#}\"

আপনার কাছে কি ব্যাশ 5+ সিনট্যাক্সের জন্য কোনও রেফারেন্স রয়েছে? আমি সব 58 দৃষ্টান্ত অনুসন্ধান ~মধ্যে ম্যানুয়াল এবং এটি দেখতে পাইনি।
টম হেল

... এবং আপনি এটি দিয়ে কীভাবে করবেন $@? bash: ${@[@]:(-1)}: bad substitution
টম হেল

1
হ্যাঁ, একটি man bashরেফারেন্স রয়েছে (@ শিরোনামে প্রসারিত উত্তরটি দেখুন)। @ টমহেল
আইজাক

1
@হয় না একটি অ্যারের (ভাল, না পুরোপুরি একটি অ্যারের ) ব্যাশ এবং এটা ইনডেক্স (গ্রহণ করে না []পৃথক আর্গুমেন্ট জন্য) সাবস্ক্রিপ্ট। আপনার ব্যবহার ${@:(-1)}বা সমমানের প্রয়োজন। @শিরোনামে প্রসারিত এন্ট্রি চেক করুন । @ টমহেল
আইজাক

-2

এছাড়াও আপনি এটি করতে পারেন:

$ a=(a b c d e f)
$ echo ${a[$(expr ${#a[@]} - 1)]}

ফলাফল:

$ f

আপনি যা করছেন তা অ্যারে এবং বিয়োগ -1 এর উপাদানগুলির সমস্ত গণনা পাচ্ছে কারণ আপনি সমস্ত উপাদান পেয়ে যাচ্ছেন, 0 অ্যারের সূচক থেকে শুরু করে না।

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