শেলের মধ্যে structure @ এর ডেটা স্ট্রাকচার কী?


13

আমরা সাধারণত $@argument 0 বাদে সমস্ত যুক্তি উপস্থাপন করতে ব্যবহার করি । তবে ডেটা স্ট্রাকচার কী তা আমি জানি না $@

$*ডাবল উক্তি অন্তর্ভুক্ত করার সাথে কেন এটি অন্যরকম আচরণ করে , কেউ আমাকে দোভাষী-স্তরের ব্যাখ্যা দিতে পারে?

এটি লুপের জন্য পুনরাবৃত্তি করা যেতে পারে, সুতরাং এটি অ্যারে বলে মনে হচ্ছে। তবে এটি সম্পূর্ণরূপে সহজ দ্বারা প্রতিধ্বনিত হতে পারে echo $@, যদি এটি অ্যারে হয় তবে কেবল প্রথম উপাদানটি প্রদর্শিত হবে। শেলের সীমাবদ্ধতার কারণে, আমি এটি চালিয়ে যেতে আরও পরীক্ষামূলক কোড লিখতে পারি না।

এই পোস্টের মধ্যে পার্থক্য : এই পোস্টটি দেখায় যে কীভাবে $@আলাদা হয় $*। তবে আমি ডেটা ধরণের সম্পর্কে ভাবছি $@। পাইথনের মতো ব্যাখ্যামূলক ভাষা হিসাবে শেলের একাধিক মৌলিক ধরণ অনুসারে ডেটা উপস্থাপন করা উচিত। বা অন্য কথায়, আমি কীভাবে memory @ কম্পিউটারের মেমরিতে সঞ্চয় করে তা জানতে চাই।

এটি একটি স্ট্রিং, একটি বহু-লাইন স্ট্রিং বা একটি অ্যারে?

যদি এটি একটি অনন্য ডেটা টাইপ হয়, তবে এই ধরণের উদাহরণ হিসাবে কাস্টম ভেরিয়েবলের সংজ্ঞা দেওয়া সম্ভব?



@ হাক্সিল, আমি এটি মনে করি না, আমি তাদের পার্থক্যটি আমার পোস্টের নীচে লিখেছি।
davmos

printf '%s\n' "$@"এবং এর সাথে আউটপুট পার্থক্য পরীক্ষা করে আপনি আরও ভাল পরিবেশিত হবেন printf '%s\n' "$*"echoউপযোগ ঠিক এর আর্গুমেন্ট, সেটা ব্যাপার আউটপুট যদি তারা এক বা অনেক। উভয়ই অ্যারে (স্ট্রিংয়ের), তবে ডাবল কোট করা হলে তারা আলাদা আচরণ করে। উভয়ই যদি কোনও মাল্টি-লাইন স্ট্রিং থাকে তবে তারা মাল্টি-লাইন স্ট্রিংগুলি সঞ্চয় করতে সক্ষম হবে না (যা তারা করতে পারে)। আপনি কোন সমস্যা সমাধানের চেষ্টা করছেন তা পরিষ্কার নয়।
কুসালানন্দ

2
আপনার প্রশ্নটি @varপার্লের অন্তর্নিহিত স্টোরেজের ক্ষেত্রে ভেরিয়েবল কী তা জিজ্ঞাসার সমতুল্য । একটি সাধারণ পার্ল প্রোগ্রামের দৃষ্টিকোণ থেকে, এটি অ্যারে / তালিকা হিসাবে অ্যাক্সেসযোগ্য (এবং এমন কোনও বিষয় রয়েছে যেখানে একটি তালিকা প্রত্যাশিত বলে প্রত্যাশা করা হয়) এর চেয়ে সত্যই কিছু যায় আসে না।
কুসালানন্দ

উত্তর:


16

এটি বোর্ন শেলের একটি হ্যাক হিসাবে শুরু হয়েছিল। বোর্ন শেল-এ, আইএফএস শব্দ বিভাজনটি তালিকার প্রসঙ্গে সমস্ত শব্দে (কমান্ড লাইন আর্গুমেন্ট বা forলুপগুলি লুপের শব্দগুলিতে) করা হয়েছিল (টোকেনাইজেশনের পরে )। তোমার যদি থাকত:

IFS=i var=file2.txt
edit file.txt $var

দ্বিতীয় লাইন 3 কথায় tokenised প্রাপ্ত হয় $varপ্রসারিত করা হবে, এবং বিভক্ত + + উল্লিখিত glob তিনটি শব্দের উপর সম্পন্ন করা হবে, তাই আপনি চলমান শেষ পর্যন্ত হবে edসঙ্গে t, f, le.txt, f, le2.txtআর্গুমেন্ট হিসাবে।

এর কিছু অংশ উদ্ধৃতি বিভক্ত + গ্লোব প্রতিরোধ করবে। বোর্ন শেলটি প্রথমে মনে করেছিল যে কোন অক্ষরগুলি অভ্যন্তরীণভাবে 8 তম বিট স্থাপন করে উদ্ধৃত হয়েছিল (এটি পরে পরিবর্তিত হয়েছিল যখন ইউনিক্স 8 বিট পরিষ্কার হয়ে গেছে, তবে শেলটি এখনও কোন বাইট উদ্ধৃত হয়েছিল তা মনে রাখার অনুরূপ কিছু করেছিল)।

উভয়ই ছিল $*এবং $@মাঝের জায়গার সাথে অবস্থানগত পরামিতিগুলির সংমিশ্রণ ছিল। কিন্তু $@যখন ডাবল-কোটসের ভিতরে ছিল তখন একটি বিশেষ প্রক্রিয়াজাতকরণ ছিল । তাহলে $1অন্তর্ভুক্ত foo barএবং $2অন্তর্ভুক্ত baz, "$@"প্রসারিত হবে:

foo bar baz
^^^^^^^ ^^^

( ^উপরেরটি দিয়ে ইঙ্গিত করে যে কোন অক্ষরের মধ্যে 8 তম বিট সেট রয়েছে)। যেখানে প্রথম স্থানটি উদ্ধৃত করা হয়েছিল (8 তম বিট সেট ছিল) তবে দ্বিতীয়টি নয় (একটি শব্দটি অন্তরঙ্গ শব্দ হিসাবে যুক্ত হয়েছে)।

এবং এটি আইএফএস বিভাজন যা আর্গুমেন্টগুলি পৃথক করার ক্ষেত্রে যত্ন নেয় (ধরে নেওয়া যায় যে স্থানের অক্ষরটি $IFSডিফল্টরূপে রয়েছে)। এটি $*পূর্বসূরীর মাশে শেলটিতে কীভাবে প্রসারিত হয়েছিল (এটি নিজেই থমসন শেলের উপর ভিত্তি করে, যখন বোর্ন শেলটি স্ক্র্যাচ থেকে লেখা হয়েছিল) এর অনুরূপ ।

এটি ব্যাখ্যা করে যে কেন পজিশনাল "$@"প্যারামিটারগুলির তালিকা খালি ছিল বর্ন শেলটি প্রথমে কিছুই না করে ফাঁকা স্ট্রিংয়ে প্রসারিত হবে (আপনাকে এটির সাথে কাজ ${1+"$@"}করতে হবে) কেন এটি খালি "$@"অবস্থানীয় পরামিতি রাখেনি এবং কেন করল না $IFSস্থান অক্ষর না থাকলে কাজ করবে না।

উদ্দেশ্যটি ছিল যে আর্গুমেন্টের তালিকাটি অন্য কমান্ডের কাছে ভারব্যাটিমটি পাস করতে সক্ষম হবে, তবে এটি খালি তালিকার জন্য, খালি উপাদানগুলির জন্য বা $IFSস্থান না থাকলে সঠিকভাবে কাজ করে না (প্রথম দুটি বিষয় শেষ পর্যন্ত পরবর্তী সংস্করণগুলিতে স্থির করা হয়েছিল) )।

কর্ন শেল (যার উপর পসিক্স স্পেক ভিত্তিক রয়েছে) কিছু আচরণে সেই আচরণটি পরিবর্তন করেছে:

  • আইএফএস বিভাজন কেবলমাত্র অব্যক্ত বিস্তারের ফলস্বরূপ করা হয় (আক্ষরিক শব্দের মতো editবা file.txtউপরের উদাহরণে নয়)
  • $*এবং উদ্ধৃত ব্যতীত শূন্য থাকাকালীন $@প্রথম অক্ষর $IFSবা স্পেসের সাথে যোগদান করা হয় , জোয়ারটি বোর্ন শেলের মতোই উদ্বিগ্ন এবং যখন শূন্য থাকে তখন অবস্থানগত প্যারামিটারগুলি বিভাজক ব্যতীত যুক্ত করা হয়।$IFS"$@""$*"IFS
  • এটা অ্যারে জন্য সমর্থন যোগ, এবং ${array[@]} ${array[*]}বোর্নের কথা স্মরণ করিয়ে দেয় $*এবং $@কিন্তু আছে 1 পরিবর্তে indice 0 থেকে শুরু, এবং বিক্ষিপ্ত (মিশুক অ্যারে মত আরো) যা মানে $@সত্যিই একটি ksh অ্যারে হিসাবে গণ্য করা যাবে না (সঙ্গে তুলনা csh/ rc/ zsh/ fish/ yashযেখানে $argv/ $*স্বাভাবিক অ্যারে)।
  • খালি উপাদান সংরক্ষণ করা হয়।
  • "$@"যখন $#0 এখন খালি স্ট্রিং এর পরিবর্তে কিছুই বিস্তৃতি, "$@"কাজ করে $IFSযখন ব্যতীত স্পেস ধারণ করে না IFSখালি। শূন্য থাকা অবস্থায় $*ওয়াইল্ডকার্ড ব্যতীত একটি অনাবৃত একটি যুক্তিতে প্রসারিত হয় (যেখানে অবস্থানগত প্যারামিটারগুলি স্থানের সাথে যুক্ত হয়) $IFS

ksh93 উপরের বাকি কয়েকটি সমস্যা সমাধান করেছে। Ksh93 সালে $*এবং $@অবস্থানগত পরামিতি তালিকায় বিস্তৃতি, এর মান নির্বিশেষে পৃথক $IFS, এবং তারপর আরও বিভক্ত + + globbed + + বক্রবন্ধনী-প্রসারিত তালিকা প্রেক্ষিতে, $*প্রথম যোগদান বাইট এর (না চরিত্র) $IFS, "$@"লিস্টে তালিকা প্রেক্ষিতে বিস্তৃতি মধ্যে অবস্থানগত পরামিতিগুলির মান নির্বিশেষে $IFS। তালিকাবিহীন প্রসঙ্গে, এর মতো var=$@, $@স্থানটির মান নির্বিশেষে সংযুক্ত করা হয় $IFS

bashএর অ্যারেগুলি ksh এর পরে তৈরি করা হয়েছে। পার্থক্যগুলি হ'ল:

  • অব্যর্থ বিস্তারের উপর কোনও ব্রেস-প্রসার নেই
  • $IFSবাইট পরিবর্তে প্রথম চরিত্র
  • কিছু কোণার পার্থক্য যেমন খালি $*যখন নন-তালিকায় প্রসঙ্গকে অ-উদ্ধৃত হয় তখন প্রসারণের মতো differences$IFS

যদিও পসিক্স স্পেকটি বেশ অস্পষ্ট ছিল, এটি এখন কমবেশি বাশের আচরণকে নির্দিষ্ট করে।

এটিতে kshবা এটিতে সাধারণ অ্যারে থেকে পৃথক bash:

  • সূচক (ব্যতীত 1 পরিবর্তে 0 থেকে আরম্ভ হয় "${@:0}"যার মধ্যে $0(একটি অবস্থানগত প্যারামিটার হয়, এবং ফাংশন আপনি ফাংশনের নাম অথবা শেল এবং কিভাবে ম ফাংশন পূর্বনির্ধারণ হয়েছিল) উপর নির্ভর করে না দেয়)।
  • আপনি স্বতন্ত্রভাবে উপাদান বরাদ্দ করতে পারবেন না
  • এটি বিরল নয়, আপনি পৃথকভাবে উপাদানগুলি আনসেট করতে পারবেন না
  • shift ব্যবহার করা যেতে পারে.

ইন zshবা yashযেখানে অ্যারে স্বাভাবিক অ্যারে হয় (বিক্ষিপ্ত না, সূচকের এক সব অন্যান্য শাঁস কিন্তু ksh / ব্যাশ মত শুরু), $*একটি স্বাভাবিক অ্যারে হিসাবে গণ্য হবে। zshএর $argvসাথে একটি উপাধি রয়েছে (সামঞ্জস্যের জন্য csh)। বা $*হিসাবে একই (আর্গুমেন্টের প্রথম চরিত্রের সাথে যোগ হয়েছে তবে তালিকার প্রসঙ্গে এখনও আলাদা হয়নি)। কর্ন-স্টাইলের বিশেষ প্রক্রিয়াজাতকরণ পছন্দ করে বা হয় ।$argv${argv[*]}$IFS"$@""${argv[@]}""${*[@]}"}


8

তবে ডেটা স্ট্রাকচার কী তা আমি জানি না $@

এটি একটি বিশেষ পরামিতি যা অবস্থানগত পরামিতিগুলির মানগুলিতে প্রসারিত হয় ... তবে এটি পরিভাষাটি সম্পর্কে মজাদার নয়।

আমরা অবস্থানগত পরামিতিগুলিকে অংশ হিসাবে $@দেখতে পারি, সুতরাং এর রয়েছে অনেকগুলি পৃথক উপাদান ( $1, $2...), যা স্বতন্ত্রভাবে অ্যাক্সেস করা যায় এবং একটানা প্রাকৃতিক সংখ্যা দ্বারা নামকরণ করা হয়। এটি এটিকে এমন কিছু করে তোলে যা সাধারণত অ্যারে বলে।

সিনট্যাক্সটি কিছুটা অদ্ভুত, যদিও এমনকি সীমাবদ্ধ। অ্যারের একক উপাদান পৃথকভাবে সংশোধন করার কোনও উপায় নেই। পরিবর্তে, পুরো জিনিসটি একবারে সেট করতে হবে। (আপনি set -- "$@" fooকোনও মান সংযোজন করতে , বা set -- "${@:1:2}" foo "${@:3}"মাঝখানে একটি মান যুক্ত করতে ব্যবহার করতে পারেন But তবে উভয় ক্ষেত্রে আপনাকে পুরো ফলাফলের তালিকাটি লিখতে হবে))

$*ডাবল উক্তি অন্তর্ভুক্ত করে কেন এটির সাথে আলাদা আচরণ করে ,

কারণ তারা ভিন্ন আচরণ করার জন্য সংজ্ঞায়িত হয়েছে।

তবে এটি সম্পূর্ণরূপে সহজ দ্বারা প্রতিধ্বনিত হতে পারে echo $@, যদি এটি অ্যারে হয় তবে কেবল প্রথম উপাদানটি প্রদর্শিত হবে।

যদি আপনি এই সত্যটি বোঝান যা a=(foo bar asdf); echo $aকেবলমাত্র আউটপুট করবে foo, তবে এটি বেশিরভাগ ক্ষেত্রে শেল সিনট্যাক্সের একটি স্পর্শ, এবং সত্য যে ksh- স্টাইল নামের অ্যারেগুলি অবস্থানগত পরামিতিগুলির পরে এবং পরে তৈরি করা হয়েছিল $@। সরলটি $aএকইরূপে ${a[0]}এটির জন্য এটি একটি একক স্কেলারের মানটির পশ্চাদমুখে সামঞ্জস্যপূর্ণ অর্থ রাখে না কেন, aঅ্যারে বা সাধারণ স্কেলারের পরিবর্তনশীল কিনা তা নির্বিশেষে ।

@সাইন পুরো তালিকা উল্লেখ করে নাম অ্যারে সঙ্গে পুনঃব্যবহার করা হয়নি "${a[@]}"উপায় পুরো তালিকা পেতে হয়। নামযুক্ত অ্যারেগুলির সাথে তুলনা $@করে অপ্রয়োজনীয় ধনুর্বন্ধনী এবং বন্ধনী এবং নামটি কেবল এড়িয়ে যায়।

বা অন্য কথায়, আমি $@কম্পিউটার মেমোরিতে কীভাবে সঞ্চিত তা জানতে চাই ।

এটি বাস্তবায়নের উপর নির্ভর করে, আপনার যত্ন নেওয়া কোনও বিশেষ শেলের উত্স কোডটি দেখতে হবে।

এটি একটি স্ট্রিং, একটি বহু-লাইন স্ট্রিং বা একটি অ্যারে?

একটি অ্যারে, বেশিরভাগ। যদিও ksh- শৈলীর নামযুক্ত অ্যারে থেকে পৃথক, যেহেতু তারা সূচি হিসাবে স্বতঃস্ফূর্ত nonnegative পূর্ণসংখ্যার থাকতে পারে, কেবল ধারাবাহিকভাবে নয় $@। (অর্থাৎ, একটি নামাঙ্কিত অ্যারের বিক্ষিপ্ত হতে পারে, এবং যেমন সূচী আছে 1, 3এবং 4সঙ্গে 0এবং 2অনুপস্থিত। যে অবস্থানগত পরামিতি সঙ্গে সম্ভব নয়।)

এটি কোনও একক স্ট্রিং নয়, যেহেতু এটি পৃথক উপাদানগুলিতে প্রসারিত করা যায় এবং উপাদানগুলির রেখাগুলি কল করাও ঠিক নয়, যেহেতু কোনও নিয়মিত পরিবর্তনশীল, বা অবস্থানগত প্যারামিটারগুলির $@একটিতেও নিউলাইন থাকতে পারে lines

যদি এটি একটি অনন্য ডেটা টাইপ হয়, তবে এই ধরণের উদাহরণ হিসাবে কাস্টম ভেরিয়েবলের সংজ্ঞা দেওয়া সম্ভব?

না। তবে নামযুক্ত অ্যারেগুলি সম্ভবত যাইহোক আরও কার্যকর।


1
+1 টি। টিএল: ডিআর $@কোনও ডেটা স্ট্রাকচার নয়, অবস্থানগত-পরামিতিগুলির ডেটা স্ট্রাকচারটি প্রসারিত করার জন্য এটি কয়েকটি ফাংশন / অপারেটরগুলির মধ্যে একটি ।
পিটার কর্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.