মাঝখানে কিছু সূচকে আমি কীভাবে ব্যাশ অ্যারে স্থানান্তর করব?


12
1  #!/bin/bash
2  # query2.sh
3
4  numbers=(53 8 12 9 784 69 8 7 1)
5  i=4
6
7  echo ${numbers[@]} # <--- this echoes "53 8 12 9 784 69 8 7 1" to stdout.
8  echo ${numbers[i]} # <--- this echoes "784" to stdout.
9
10 unset numbers[i]
11
12 echo ${numbers[@]} # <--- this echoes "53 8 12 9 69 8 7 1" to stdout.
13 echo ${numbers[i]} # <--- stdout is blank.

১৩ লাইনে স্টাডাউটটি ফাঁকা কেন, মনে হচ্ছে অ্যারেটি 12 লাইনের স্টাডাউট দ্বারা বিচার করে আপডেট করা হয়েছে?

এবং তাই, "69" এর উদ্দেশ্যযুক্ত উত্তর পেতে আমার কী করা উচিত?


1
কোডিং কাজের ধরণের বিষয়টি বিবেচনা করে এই প্রশ্নের বোঝা যায়, আপনার সতর্কতা নেওয়া উচিত: দেখুন আমার স্ক্রিপ্টে কিছু ভুল আছে বা বাশ পাইথনের চেয়ে অনেক ধীর গতিতে আছে?
ওয়াইল্ডকার্ড

উত্তর:


21

unsetএকটি উপাদান অপসারণ। এটি বাকি উপাদানগুলিকে পুনর্বার করে না।

আমরা declare -pঠিক কী হয় তা দেখতে ব্যবহার করতে পারি numbers:

$ unset "numbers[i]"
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")

numbersআর কোনও উপাদান নেই তা পর্যবেক্ষণ করুন 4

আরেকটি উদাহরণ

পালন:

$ a=()
$ a[1]="element 1"
$ a[22]="element 22"
$ declare -p a
declare -a a=([1]="element 1" [22]="element 22")

অ্যারের a2 থেকে 21 এর মধ্যে কোনও উপাদান নেই Bash

সূচকের পুনর্নির্মাণকে বাধ্য করার জন্য প্রস্তাবিত পদ্ধতি

আসুন numbersঅনুপস্থিত উপাদান দিয়ে অ্যারে দিয়ে শুরু করা যাক 4:

$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")

যদি আমরা সূচকগুলি পরিবর্তন করতে চাই, তবে:

$ numbers=("${numbers[@]}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")

এখন একটি উপাদান সংখ্যা 4এবং এটি মূল্য আছে 69

এক পদক্ষেপে কোনও উপাদান এবং রেন্টার অ্যারে সরানোর বিকল্প পদ্ধতি

আবার, এর সংজ্ঞা দেওয়া যাক numbers:

$ numbers=(53 8 12 9 784 69 8 7 1)

মন্তব্যে টবি স্পিডের পরামর্শ অনুসারে , চতুর্থ উপাদানটি অপসারণ এবং অবশিষ্ট উপাদানগুলিকে এক ধাপে পুনর্বিবেচনা করার একটি পদ্ধতি:

$ numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")
$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [4]="69" [5]="8" [6]="7" [7]="1")

আপনি দেখতে পাচ্ছেন, চতুর্থ উপাদানটি সরানো হয়েছিল এবং বাকি সমস্ত উপাদানকে পুনরায় নামকরণ করা হয়েছিল।

${numbers[@]:0:4}স্লাইস অ্যারে numbers: এটি 0 টি দিয়ে শুরু হওয়া প্রথম চারটি উপাদান নেয়।

একইভাবে, ${numbers[@]:5}স্লাইস অ্যারে numbers: এটি উপাদান 5 থেকে শুরু করে অ্যারের শেষ অবধি অবধি সমস্ত উপাদান গ্রহণ করে takes

একটি অ্যারের সূচকগুলি প্রাপ্ত

মান একটি অ্যারের সঙ্গে প্রাপ্ত করা যাবে ${a[@]}। এই মানগুলির সাথে মিলে এমন সূচকগুলি (বা কীগুলি ) সন্ধান করতে ব্যবহার করুন ${!a[@]}

উদাহরণস্বরূপ, numbersঅনুপস্থিত উপাদানটির সাথে আবার আমাদের অ্যারে বিবেচনা করুন 4:

$ declare -p numbers
declare -a numbers=([0]="53" [1]="8" [2]="12" [3]="9" [5]="69" [6]="8" [7]="7" [8]="1")

কোন সূচকগুলি নির্ধারিত হয়েছে তা দেখতে:

$ echo "${!numbers[@]}"
0 1 2 3 5 6 7 8

আবার 4সূচকগুলির তালিকা থেকে নিখোঁজ।

নথিপত্র

থেকে man bash:

unsetBuiltin অ্যারে ধ্বংস করতে ব্যবহৃত হয়। unset name[subscript]সূচকে অ্যারের উপাদানটি ধ্বংস করে subscript। সূচকযুক্ত অ্যারেতে নেতিবাচক সাবস্ক্রিপ্টগুলি উপরে বর্ণিত হিসাবে ব্যাখ্যা করা হয়েছে। পথের নাম সম্প্রসারণের কারণে অযাচিত পার্শ্ব প্রতিক্রিয়া এড়াতে যত্ন নেওয়া উচিত। unset name, কোথায় nameএকটি অ্যারে, বা unset name[subscript]যেখানে subscriptরয়েছে * বা @সম্পূর্ণ অ্যারে সরিয়ে দেয়।


1
নোট করুন যে শেল অ্যারে সিনট্যাক্স একই জাতীয় নামযুক্ত ভেরিয়েবলগুলি মোকাবেলা করা সহজ করার একটি উপায় মাত্র। নিজেই কোনও অ্যারে নেই ; প্রকৃতপক্ষে, আপনি লেখার পরে a=(), ভেরিয়েবলটি aএখনও অপরিজ্ঞাত না হওয়া অবধি আপনি তার সূচকগুলির কোনওটিতে অর্পণ করেন না।
চিপনার

@ জন 1024: এই উত্তরের জন্য আপনাকে ধন্যবাদ। অভিযুক্ত ফলাফল অর্জনের জন্য প্রস্তাবিত উত্তর অন্তর্ভুক্ত করার জন্য আপনি সম্ভবত এটি প্রসারিত করতে পারেন?
অ্যান্টনি ওয়েবার

@ অ্যান্থনি ওয়েবার শিওর সূচকগুলির পুনর্নির্মাণকে কীভাবে বাধ্য করা যায় তা দেখানোর জন্য আমি উত্তরে একটি বিভাগ যুক্ত করেছি।
1024

2
কেবল একটি বিকল্প পদ্ধতির উল্লেখ করতে (যা কিছু কোডের জন্য আরও ভাল ফিট হতে পারে): পরিবর্তে unset numbers[4], স্লাইসিং ব্যবহার করে পুরো অ্যারেটি বরাদ্দ করুন, numbers=("${numbers[@]:0:4}" "${numbers[@]:5}")(আমি উত্তর হিসাবে পোস্ট করব তবে সঠিকভাবে ব্যাখ্যা করার জন্য সময় নেই)।
টবি স্পিড

@ জন 1024: এটি করার জন্য আপনি প্রশংসা করুন। এবং thnx টবি :)
অ্যান্টনি ওয়েবার

5

bashএর মতো অ্যারেগুলি kshআসলে অ্যারে নয়, তারা আরও বেশি ধনাত্মক পূর্ণসংখ্যার (বা তথাকথিত স্পার্স অ্যারে ) সীমাবদ্ধ কীগুলির সাথে সহযোগী অ্যারেগুলির মতো । বাস্তব অ্যারে সঙ্গে একটি শেল জন্য, আপনি মত শাঁস কটাক্ষপাত থাকতে পারে rc, es, fish, yash, zsh(এমনকি csh/ tcshতারা ভাল এড়ানো করছি যদিও ঐ শাঁস এত সমস্যা থাকতে)।

ইন zsh:

a=(1 2 3 4 5)
a[3]=() # remove the 3rd element
a[1,3]=() # remove the first 3 elements
a[-1]=() # remove the last element

(দ্রষ্টব্য যে zsh এ, unset 'a[3]'এটির সাথে উন্নত সামঞ্জস্যের জন্য এটি খালি স্ট্রিংয়ে সেট করে ksh)

ইন yash:

a=(1 2 3 4 5)
array -d a 3 # remove the 3rd element
array -d a 1 2 3 # remove the first 3 elements
array -d a -1 # remove the last element

ইন fish( bash/ এর বিপরীতে বোর্নের মতো শেল নয় zsh):

set a 1 2 3 4 5
set -e a[3] # remove the 3rd element
set -e a[1..3] # remove the first 3 elements
set -e a[-1] # remove the last element

ইন es(ভিত্তিতে rc, বোর্নের মতো নয়)

a = 1 2 3 4 5
a = $a(... 2 4 ...) # remove the 3rd element
a = $a(4 ...) # remove the first 3 elements
a = $a(... `{expr $#a - 1}) # remove the last element
# or a convoluted way that avoids forking expr:
a = $a(... <={@{*=$*(2 ...); return $#*} $a})

ইন kshএবংbash

আপনি যদি করেন তবে আপনি অ্যারেটিকে সাধারণ অ্যারে হিসাবে ব্যবহার করতে পারেন:

a=("${a[@]}")

প্রতিটি মুছুন বা সন্নিবেশ করানোর ক্রিয়াকলাপের পরে সূচকগুলির তালিকাটি সুসংগঠিত নয় বা 0 থেকে শুরু নাও হতে পারে Also এছাড়াও নোট করুন ksh/ bashঅ্যারেগুলি 0 থেকে শুরু হয়, 1 নয় (বাদে $@(কিছু উপায়ে))।

এটি কার্যকরভাবে উপাদানগুলিকে পরিপাটি করে এবং ধারাবাহিকভাবে 0, 1, 2 ... সূচিতে সরিয়ে দেবে।

এছাড়াও মনে রাখবেন যে আপনাকে এগুলি উদ্ধৃত করতে হবে number[i]:

unset 'number[i]'

অন্যথায়, বর্তমান ডিরেক্টরিতে unset numberiএকটি ফাইল বলা numberiহয়েছিল বলে এটিরূপে আচরণ করা হবে।

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