`সেট -u` দিয়ে ফাঁকা অ্যারের প্রসারণ বাশ করুন`


108

আমি একটি বাশ স্ক্রিপ্ট লিখছি যা রয়েছে set -uএবং খালি অ্যারে সম্প্রসারণে আমার একটি সমস্যা রয়েছে: ব্যাশটি প্রসারণের সময় একটি খালি অ্যারেটিকে একটি আনসেট ভেরিয়েবল হিসাবে দেখায়:

$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable

( declare -a arrকোন সাহায্য করে না।)

এর সাধারণ সমাধান হ'ল ${arr[@]-}পরিবর্তে ব্যবহার করা, এভাবে ("অপরিজ্ঞাত") ফাঁকা অ্যারের পরিবর্তে একটি খালি স্ট্রিং স্থাপন করা। তবে এটি একটি ভাল সমাধান নয়, যেহেতু এখন আপনি এটির মধ্যে একটি ফাঁকা স্ট্রিং এবং একটি খালি অ্যারের একটি অ্যারের মধ্যে পার্থক্য করতে পারবেন না। (@ -স্প্যাশন ব্যাশের ক্ষেত্রে বিশেষ, এটি প্রসারিত "${arr[@]}"হয় "${arr[0]}" "${arr[1]}" …যা এটি কমান্ড লাইন তৈরির জন্য উপযুক্ত সরঞ্জাম হিসাবে তৈরি করে))

$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0

তাহলে কি সমস্যাটির আশেপাশে কোনও উপায় রয়েছে, কোনও অ্যারের দৈর্ঘ্য পরীক্ষা করা if(নীচের কোডের নমুনা দেখুন), বা -uসেই সংক্ষিপ্ত অংশটির জন্য সেটিংস বন্ধ করে দেওয়া?

if [ "${#arr[@]}" = 0 ]; then
   veryLongCommandLine
else
   veryLongCommandLine "${arr[@]}"
fi

আপডেট:bugs ইেকেগামির ব্যাখ্যা দেওয়ার কারণে ট্যাগ সরানো হয়েছে ।

উত্তর:


24

শুধুমাত্র নিরাপদ বাগ্ধারা হয়${arr[@]+"${arr[@]}"}

এটি ইতিমধ্যে ইকেগামির উত্তরের প্রস্তাবনা , তবে এই থ্রেডে প্রচুর ভুল তথ্য এবং অনুমানের কাজ রয়েছে। যেমন অন্য নিদর্শন, ${arr[@]-}বা ${arr[@]:0}হয় না ব্যাশ সব প্রধান সংস্করণ জুড়ে নিরাপদ।

নীচের টেবিলটি দেখায়, কেবলমাত্র সমস্ত আধুনিক-ইশ বাশ সংস্করণে নির্ভরযোগ্য নির্ভরযোগ্যতা ${arr[@]+"${arr[@]}"}(কলাম +")। লক্ষণীয়, অন্যান্য বেশ কয়েকটি বিস্তৃতি বাশ ৪.২-এ ব্যর্থ হয়েছে, সংক্ষেপে (দুর্ভাগ্যক্রমে) সংক্ষিপ্ত ${arr[@]:0}প্রতিমা, যা কেবল একটি ভুল ফলাফল দেয় না তবে বাস্তবে ব্যর্থ হয়। আপনার যদি 4.4 এর আগে সংস্করণগুলি সমর্থন করার প্রয়োজন হয় এবং বিশেষত 4.2 এর মধ্যে, তবে এটিই কেবল কাজের প্রতিচ্ছবি।

সংস্করণ জুড়ে বিভিন্ন আইডিয়ামের স্ক্রিনশট

দুর্ভাগ্যক্রমে অন্যান্য +বিস্তৃতি যা এক নজরে একই দেখায় প্রকৃতপক্ষে বিভিন্ন আচরণ নির্গত হয়। :+সম্প্রসারণ নিরাপদ নয় , কারণ :-অনুপাতটি একটি শূন্য উপাদান ( ('')) এর সাথে একটি নালাকে "নাল" হিসাবে বিবেচনা করে এবং এভাবে (ধারাবাহিকভাবে) একই ফলাফলে প্রসারিত হয় না।

নেস্টেড অ্যারে ( "${arr[@]+${arr[@]}}") এর পরিবর্তে সম্পূর্ণ সম্প্রসারণের উদ্ধৃতি দেওয়া , যা আমি প্রায় সমতুল্য হওয়ার আশা করতাম, এটি একইভাবে 4.2-তে অনিরাপদ।

আপনি এই सारটিটিতে ব্যাশের বেশ কয়েকটি অতিরিক্ত সংস্করণের ফলাফলের সাথে এই ডেটাটি তৈরি করেছে এমন কোডটি আপনি দেখতে পাচ্ছেন ।


4
আমি আপনাকে পরীক্ষা করতে দেখছি না "${arr[@]}"। আমি কিছু অনুপস্থিত করছি? আমি যা দেখতে পাচ্ছি তা থেকে এটি অন্তত কাজ করে 5.x
এক্স-ইউরি

4
@ এক্স-ইউরি হ্যাঁ, বাশ ৪.৪ পরিস্থিতি স্থির করেছে; আপনার স্ক্রিপ্টটি কেবল ৪.৪++ এ চলবে তবে আপনার এই প্যাটার্নটি ব্যবহার করার দরকার নেই তবে অনেকগুলি সিস্টেম এখনও পূর্ববর্তী সংস্করণগুলিতে রয়েছে।
dimo414

একেবারে। দেখতে সুন্দর দেখতে (উদাহরণস্বরূপ ফর্ম্যাট করা) অতিরিক্ত স্থান
স্পষ্টত দোষের

4.4.20 বাশ-এ (1) এটি ইচ্ছাকৃতভাবে কাজ করে না। এই উত্তরের পরিবর্তনশীল প্রসারণের উদ্ধৃতি একটি অ্যারেতে আইটেমের সংখ্যা গণনা করে না । সবচেয়ে খারাপটি, এটি পরিবর্তনশীলটিকে উদ্ধৃত ছেড়ে দেবে।
inetknght

@ আইনেটকিংএইচটি আপনি কী পর্যবেক্ষণ করছেন তার একটি এমসিভিই ভাগ করতে পারবেন ? বিজোড় সিনট্যাক্স সত্ত্বেও এই হয় সঠিকভাবে উদ্ধৃত। বাহ্যটি খালি না হলে বাইরের (নিঃশব্দ) প্রসারণটি অভ্যন্তরীণ (উদ্ধৃত) প্রসারণে প্রসারিত হয়।
dimo414

84

ডকুমেন্টেশন অনুযায়ী,

একটি সাবস্ক্রিপ্ট একটি মান নির্ধারিত করা থাকলে একটি অ্যারে ভেরিয়েবল সেট হিসাবে বিবেচিত হবে। নাল স্ট্রিং একটি বৈধ মান।

কোনও সাবস্ক্রিপ্টকে কোনও মূল্য নির্ধারণ করা হয়নি, সুতরাং অ্যারে সেট করা হয়নি।

ডকুমেন্টেশনটি এখানে ত্রুটিটি যথাযথ প্রমাণিত করার পরে, ৪.৪-এর পরে আর এটি হবে না ।

$ bash --version | head -n 1
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

$ set -u

$ arr=()

$ echo "foo: '${arr[@]}'"
foo: ''

পুরানো সংস্করণগুলিতে আপনি যা চান তা অর্জন করতে আপনি ইনডলাইন ব্যবহার করতে পারেন: এর ${arr[@]+"${arr[@]}"}পরিবর্তে ব্যবহার করুন "${arr[@]}"

$ function args { perl -E'say 0+@ARGV; say "$_: $ARGV[$_]" for 0..$#ARGV' -- "$@" ; }

$ set -u

$ arr=()

$ args "${arr[@]}"
-bash: arr[@]: unbound variable

$ args ${arr[@]+"${arr[@]}"}
0

$ arr=("")

$ args ${arr[@]+"${arr[@]}"}
1
0: 

$ arr=(a b c)

$ args ${arr[@]+"${arr[@]}"}
3
0: a
1: b
2: c

4.2.25 এবং 4.3.11 বাশ দিয়ে পরীক্ষিত।


4
এটি কীভাবে এবং কেন কাজ করে কেউ ব্যাখ্যা করতে পারেন? আমি [@]+আসলে কী করে এবং দ্বিতীয়টি কেন ${arr[@]}আনবাউন্ড ত্রুটি সৃষ্টি করে না তা নিয়ে আমি বিভ্রান্ত ।
মার্টিন ভন উইট্টিচ

4
${parameter+word}সেট না করা wordথাকলে কেবল প্রসারিত parameterহয়।
ইকেগামী

4
${arr+"${arr[@]}"}সংক্ষিপ্ত এবং ঠিক পাশাপাশি কাজ করে বলে মনে হচ্ছে।
প্রতি সিডারবার্গ

4
@ পের সেরদারবার্গ, কাজ করে না। unset arr, arr[1]=a, args ${arr+"${arr[@]}"}বনামargs ${arr[@]+"${arr[@]}"}
ikegami

4
সুনির্দিষ্টভাবে বলতে গেলে, +প্রসারণ ঘটে না এমন ক্ষেত্রে (যথা, একটি খালি অ্যারে) কিছুতেই বিস্তৃতি প্রতিস্থাপন করা হয় যা খালি অ্যারেটিতে প্রসারিত হ'ল তাই। :+এটি অনিরাপদ কারণ এটি কোনও একক-উপাদান ('')অ্যারেটিকে আনসেট হিসাবে বিবেচনা করে এবং একইভাবে মান হারাতে কিছুইতে প্রসারিত করে না।
dimo414

24

@ ইকগামির গৃহীত উত্তরগুলি সম্পূর্ণ ভুল! সঠিক জ্বলন হ'ল ${arr[@]+"${arr[@]}"}:

$ countArgs () { echo "$#"; }
$ arr=('')
$ countArgs "${arr[@]:+${arr[@]}}"
0   # WRONG
$ countArgs ${arr[@]+"${arr[@]}"}
1   # RIGHT
$ arr=()
$ countArgs ${arr[@]+"${arr[@]}"}
0   # Let's make sure it still works for the other case...

আর কোনও পার্থক্য নেই। bash-4.4.23: arr=('') && countArgs "${arr[@]:+${arr[@]}}"উত্পাদন 1। তবে ${arr[@]+"${arr[@]}"}ফর্মটি কোলন যুক্ত / যোগ না করে খালি / খালি খালি মানের মধ্যে পার্থক্য করতে দেয়।
এক্স-ইউরি

arr=('') && countArgs ${arr[@]:+"${arr[@]}"}-> 0, arr=('') && countArgs ${arr[@]+"${arr[@]}"}-> 1
এক্স-ইয়ুরি

4
এটি আমার উত্তরে অনেক আগেই ঠিক হয়ে গেছে। (আসলে, আমি নিশ্চিত যে আমি এর আগে এই প্রতিক্রিয়াটির উত্তর সম্পর্কে একটি মন্তব্য
রেখেছি

16

দেখা যাচ্ছে অ্যারে হ্যান্ডলিংটি সম্প্রতি প্রকাশিত (2016/09/16) বাশ ৪.৪ (উদাহরণস্বরূপ ডেবিয়ান প্রসারীতে উপলব্ধ) এ পরিবর্তন করা হয়েছে।

$ bash --version | head -n1
bash --version | head -n1
GNU bash, version 4.4.0(1)-release (x86_64-pc-linux-gnu)

এখন খালি অ্যারে সম্প্রসারণ সতর্কতা বহন করে না

$ set -u
$ arr=()
$ echo "${arr[@]}"

$ # everything is fine

আমি নিশ্চিত করতে পারি, bash-4.4.12 "${arr[@]}"যথেষ্ট ছিল সঙ্গে ।
এক্স-ইউরি

14

এটি তাদের পক্ষে অন্য বিকল্প হতে পারে যারা আরআরকে সদৃশ করতে পছন্দ করেন না [@] এবং খালি স্ট্রিং রাখা ঠিক আছে

echo "foo: '${arr[@]:-}'"

পরীক্ষা করতে:

set -u
arr=()
echo a "${arr[@]:-}" b # note two spaces between a and b
for f in a "${arr[@]:-}" b; do echo $f; done # note blank line between a and b
arr=(1 2)
echo a "${arr[@]:-}" b
for f in a "${arr[@]:-}" b; do echo $f; done

10
এটি যদি আপনি কেবল চলকটি ইন্টারপোল্ট করে থাকেন তবে এটি কাজ করবে, তবে আপনি যদি অ্যারেটি ব্যবহার করতে চান forতবে অ্যারেটি অপরিজ্ঞাত / সংজ্ঞায়িত-হিসাবে খালি হলে একটি ফাঁকা স্ট্রিংয়ের সাথে শেষ হবে, যেখানে আপনি লুপের বডিটি চাইবেন অ্যারে সংজ্ঞায়িত না হলে চালাতে না।
অ্যাশ বার্লিন-টেলর

ধন্যবাদ @ আশ্বারলিন, আমি আমার উত্তরে একটি লুপ যোগ করেছি যাতে পাঠকরা সচেতন হন
জেইন

-1 এই পদ্ধতির কাছে, এটি কেবল ভুল। এটি একটি একক ফাঁকা স্ট্রিংয়ের সাথে একটি খালি অ্যারে প্রতিস্থাপন করে, যা একই নয়। গৃহীত উত্তরে প্রস্তাবিত প্যাটার্নটি, ${arr[@]+"${arr[@]}"}খালি-অ্যারে স্থিতিটি সঠিকভাবে সংরক্ষণ করে।
ডিমো 414

আমার উত্তরটি দেখুন যেখানে এই সম্প্রসারণটি ভেঙে পড়েছে সেগুলি দেখায়।
ডিমো 414

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

7

@ ইকেগামির উত্তরটি সঠিক, তবে আমি সিনট্যাক্সটিকে ${arr[@]+"${arr[@]}"}ভয়ঙ্কর বলে মনে করি । আপনি যদি দীর্ঘ অ্যারে পরিবর্তনশীল নাম ব্যবহার করেন তবে এটি স্প্যাগেটি-ইশ দেখতে স্বাভাবিকের চেয়ে দ্রুত দেখায় looks

পরিবর্তে এটি চেষ্টা করুন:

$ set -u

$ count() { echo $# ; } ; count x y z
3

$ count() { echo $# ; } ; arr=() ; count "${arr[@]}"
-bash: abc[@]: unbound variable

$ count() { echo $# ; } ; arr=() ; count "${arr[@]:0}"
0

$ count() { echo $# ; } ; arr=(x y z) ; count "${arr[@]:0}"
3

দেখে মনে হচ্ছে বাশ অ্যারের স্লাইস অপারেটরটি খুব ক্ষমা করছে।

তাহলে বাশ কেন অ্যারেগুলির প্রান্ত কেস পরিচালনা করা এত কঠিন করে তুলেছিল? দীর্ঘশ্বাস. আমি আপনাকে গ্যারান্টি দিতে পারি না যে সংস্করণটি অ্যারে স্লাইস অপারেটরকে এ জাতীয় অপব্যবহারের অনুমতি দেবে, তবে এটি আমার পক্ষে ঘৃণ্য কাজ করে।

ক্যাভেট: আমি GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) আপনার মাইলেজটি বিভিন্নভাবে ব্যবহার করতে পারি।


9
ইকেগামির মূলত এটি ছিল, তবে এটি অপসারণযোগ্য কারণ এটি তাত্ত্বিকভাবে উভয়ই (এটির কাজ করার কোনও কারণ নেই) এবং অনুশীলনে (বাশের অপের সংস্করণ এটি গ্রহণ করে নি)।

@ এইচভিডি: আপডেটের জন্য ধন্যবাদ। পাঠকগণ: উপরের কোডটি যেখানে কাজ করে না সেখানে বাশ সংস্করণগুলি খুঁজে পেলে একটি মন্তব্য যুক্ত করুন।
কেভিনার্পে

এইচভিপি ইতিমধ্যে করেছে, এবং আমি আপনাকেও বলব: "${arr[@]:0}"দেয় -bash: arr[@]: unbound variable
ইকেগামী

সংস্করণ জুড়ে কাজ করা উচিত এমন একটি জিনিস হ'ল একটি ডিফল্ট অ্যারে মান সেট করা arr=("_dummy_")এবং ${arr[@]:1}সর্বত্র বিস্তৃতি ব্যবহার করা । এটি অন্য উত্তরগুলিতে সেন্ডিনেল মানগুলি উল্লেখ করে উল্লেখ করা হয়েছে।
init_js

4
@ ইনিত_জেএস: আপনার সম্পাদনা দুঃখজনকভাবে প্রত্যাখ্যান করা হয়েছিল। আমি আপনাকে পৃথক উত্তর হিসাবে যুক্ত করার পরামর্শ দিচ্ছি। (সূত্র: stackoverflow.com/review/suggested-edits/19027379 )
kevinarpe

6

"আকর্ষণীয়" অসঙ্গতি প্রকৃতপক্ষে।

তদ্ব্যতীত,

$ set -u
$ echo $#
0
$ echo "$1"
bash: $1: unbound variable   # makes sense (I didn't set any)
$ echo "$@" | cat -e
$                            # blank line, no error

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

... ${name[@]}নামের প্রতিটি উপাদানকে একটি পৃথক শব্দে প্রসারিত করে। যখন কোনও অ্যারে সদস্য না থাকে তখন ${name[@]}কিছুই প্রসারিত হয় না।

এটিতে অবস্থানগত পরামিতিগুলির প্রসারণ সম্পর্কে যা বলে তা সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ "$@"। অ্যারে এবং অবস্থানগত পরামিতিগুলির আচরণের ক্ষেত্রে অন্যান্য অসঙ্গতি নেই এমন নয় ... তবে আমার কাছে এই বিবরণটি দুজনের মধ্যে অসামঞ্জস্যপূর্ণ হওয়ার কোনও ইঙ্গিত নেই।

অবিরত,

$ arr=()
$ echo "${arr[@]}"
bash: arr[@]: unbound variable   # as we've observed.  BUT...
$ echo "${#arr[@]}"
0                                # no error
$ echo "${!arr[@]}" | cat -e
$                                # no error

সুতরাং arr[]কি এত আনবাউন্ড নয় যে আমরা এর উপাদানগুলির একটি সংখ্যা (0), বা এর কীগুলির একটি (খালি) তালিকা পেতে পারি না? আমার কাছে এগুলি বোধগম্য এবং দরকারী - কেবলমাত্র বাহ্যিক ${arr[@]}(এবং ${arr[*]}) সম্প্রসারণ বলে মনে হয় ।


2

আমি @ ইকেগামির (স্বীকৃত) এবং @ কেভিনার্পের (খুব ভাল) উত্তরগুলিতে পরিপূরক করছি ।

আপনি "${arr[@]:+${arr[@]}}"সমস্যার সমাধান করতে পারেন । ডান হাতের পক্ষটি (অর্থাত্‍ পরে :+) একটি ভাব প্রদান করে যা বাম-হাতের পার্শ্বে সংজ্ঞায়িত / নাল নয় এমন ক্ষেত্রে ব্যবহৃত হবে।

সিনট্যাক্সটি আরকেন c নোট করুন যে অভিব্যক্তির ডান হাতটি প্যারামিটারের প্রসারণের মধ্য দিয়ে যাবে, সুতরাং ধারাবাহিক উদ্ধৃতি দেওয়ার জন্য অতিরিক্ত মনোযোগ দেওয়া উচিত।

: example copy arr into arr_copy
arr=( "1 2" "3" )
arr_copy=( "${arr[@]:+${arr[@]}}" ) # good. same quoting. 
                                    # preserves spaces

arr_copy=( ${arr[@]:+"${arr[@]}"} ) # bad. quoting only on RHS.
                                    # copy will have ["1","2","3"],
                                    # instead of ["1 2", "3"]

@ কেভিনার্পে উল্লেখ করেছেন, কম আরকেন সিনট্যাক্সটি অ্যারে স্লাইস নোটেশন ${arr[@]:0}(বাশ সংস্করণগুলিতে >= 4.4) ব্যবহার করা হয় যা সূচক 0 থেকে শুরু করে সমস্ত পরামিতিগুলিতে প্রসারিত হয় It এটির মতো পুনরাবৃত্তিও প্রয়োজন হয় না। এই সম্প্রসারণটি নির্বিশেষে কাজ করে set -u, তাই আপনি এটি সর্বদা ব্যবহার করতে পারেন। ম্যান পেজটি বলেছেন ( প্যারামিটার সম্প্রসারণের অধীনে ):

  • ${parameter:offset}

  • ${parameter:offset:length}

    ... তাহলে প্যারামিটার একটি সূচীবদ্ধ অ্যারে দ্বারা subscripted নাম @বা *, ফলাফল নিয়ে অ্যারে শুরুর দৈর্ঘ্য সদস্যদের হয় ${parameter[offset]}। Negativeণাত্মক অফসেট নির্দিষ্ট অ্যারের সর্বাধিক সূচকের চেয়ে বৃহত্তর তুলনায় নেওয়া হয়। দৈর্ঘ্য শূন্যের চেয়ে কম সংখ্যায় মূল্যায়ন করলে এটি একটি সম্প্রসারণ ত্রুটি।

আউটপুট প্রমাণ হিসাবে রাখার জন্য বিকল্প বিন্যাস সহ এটি @ কেভিনার্পের দেওয়া উদাহরণ:

set -u
function count() { echo $# ; };
(
    count x y z
)
: prints "3"

(
    arr=()
    count "${arr[@]}"
)
: prints "-bash: arr[@]: unbound variable"

(
    arr=()
    count "${arr[@]:0}"
)
: prints "0"

(
    arr=(x y z)
    count "${arr[@]:0}"
)
: prints "3"

এই আচরণটি বাশের সংস্করণগুলির সাথে পরিবর্তিত হয়। আপনি এটি লক্ষ্যও করতে পারেন যে দৈর্ঘ্য অপারেটরটি 'আনবাউন্ড ভেরিয়েবল ত্রুটি' সৃষ্টি না করেই খালি অ্যারেগুলির জন্য ${#arr[@]}সর্বদা মূল্যায়ন করবে ।0set -u


দুর্ভাগ্যক্রমে :0প্রতিমাটি 4.2 বাশে ব্যর্থ হয়েছে, সুতরাং এটি কোনও নিরাপদ পদ্ধতির নয়। আমার উত্তর দেখুন ।
ডিমো 414

1

এখানে এরকম কিছু করার কয়েকটি উপায় রয়েছে, একটি সেন্ডিনেল ব্যবহার করে এবং অন্যটি শর্তাধীন সংযোজন ব্যবহার করে:

#!/bin/bash
set -o nounset -o errexit -o pipefail
countArgs () { echo "$#"; }

arrA=( sentinel )
arrB=( sentinel "{1..5}" "./*" "with spaces" )
arrC=( sentinel '$PWD' )
cmnd=( countArgs "${arrA[@]:1}" "${arrB[@]:1}" "${arrC[@]:1}" )
echo "${cmnd[@]}"
"${cmnd[@]}"

arrA=( )
arrB=( "{1..5}" "./*"  "with spaces" )
arrC=( '$PWD' )
cmnd=( countArgs )
# Checks expansion of indices.
[[ ! ${!arrA[@]} ]] || cmnd+=( "${arrA[@]}" )
[[ ! ${!arrB[@]} ]] || cmnd+=( "${arrB[@]}" )
[[ ! ${!arrC[@]} ]] || cmnd+=( "${arrC[@]}" )
echo "${cmnd[@]}"
"${cmnd[@]}"

0

আকর্ষণীয় অসঙ্গতি; এটি আপনাকে এমন কিছু সংজ্ঞায়িত করতে দেয় যা "সেট হিসাবে বিবেচিত নয়" এখনও আউটপুটে প্রদর্শিত হবেdeclare -p

arr=()
set -o nounset
echo ${arr[@]}
 =>  -bash: arr[@]: unbound variable
declare -p arr
 =>  declare -a arr='()'

আপডেট: অন্যদের উল্লিখিত হিসাবে, এই উত্তর পোস্ট হওয়ার পরে প্রকাশিত 4.4 এ স্থির করা হয়েছে।


এটি ঠিক ভুল অ্যারে সিনট্যাক্স; আপনার প্রয়োজন echo ${arr[@]}(তবে বাশ 4.4 এর আগে আপনি এখনও একটি ত্রুটি দেখতে পাবেন)।
ডিমো 414

ধন্যবাদ @ ডিমো 414, পরের বার ডাউনভোটিংয়ের পরিবর্তে একটি সম্পাদনা করার পরামর্শ দিন। বিটিডাব্লু যদি আপনি নিজে চেষ্টা করে থাকেন echo $arr[@]তবে দেখতেন ত্রুটির বার্তাটি আলাদা।
মার্চ

-2

সর্বাধিক সহজ এবং সামঞ্জস্যপূর্ণ উপায় বলে মনে হচ্ছে:

$ set -u
$ arr=()
$ echo "foo: '${arr[@]-}'"

4
ওপি নিজেই দেখিয়েছিল যে এটি কাজ করে না। এটি কোনও কিছুর পরিবর্তে খালি স্ট্রিংয়ে প্রসারিত হয়।
ইকগামি

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