কীভাবে একটি / বিন / শ ফাংশনে সর্বশেষ আর্গুমেন্ট পাবেন


11

বাস্তবায়নের আরও ভাল উপায় কী print_last_arg?

#!/bin/sh

print_last_arg () {
    eval "echo \${$#}"  # this hurts
}

print_last_arg foo bar baz
# baz

(যদি এটি হয় তবে বলুন #!/usr/bin/zshপরিবর্তে #!/bin/shআমি কী করণীয় তা জানতাম My আমার সমস্যাটি এর বাস্তবায়নের জন্য যুক্তিসঙ্গত উপায় খুঁজে পাচ্ছে #!/bin/sh))

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


সম্পাদনা 2: আমি এ জাতীয় অস্পষ্টভাবে কথিত প্রশ্নের জন্য ক্ষমা চাইছি। আমি এই মুহূর্তে এটি পেতে আশা করি।

যদি এটির /bin/zshপরিবর্তে থাকত তবে /bin/shআমি এই জাতীয় কিছু লিখতে পারি

#!/bin/zsh

print_last_arg () {
    local last_arg=$argv[$#]
    echo $last_arg
}

শেল ফাংশনটির মধ্যে সর্বশেষ যুক্তিটি উল্লেখ করার উপায়$argv[$#] হিসাবে আমি আমার প্রথম EDIT এ যা বর্ণনা করেছি তার একটি অভিব্যক্তি উদাহরণ ।

অতএব, আমার সত্যিকার অর্থে আমার মূল উদাহরণটি লেখা উচিত ছিল:

print_last_arg () {
    local last_arg=$(eval "echo \${$#}")   # but this hurts even more
    echo $last_arg
}

... এটি স্পষ্ট করে তুলতে যে আমি যা করছি তার পরে অ্যাসাইনমেন্টের ডানদিকে রাখা কম ভয়াবহ বিষয়।

তবে নোট করুন, সমস্ত উদাহরণে সর্বশেষ যুক্তিটি অ-ধ্বংসাত্মকভাবে অ্যাক্সেস করা হয়েছে । আইওডাব্লু, শেষ যুক্তির অ্যাক্সেস স্থিতিগত আর্গুমেন্টকে পুরো অকার্যকর করে ফেলে।


unix.stackexchange.com/q/145522/117549 #! / বিন / এস এর বিভিন্ন সম্ভাবনার কথা উল্লেখ করে - আপনি কি এটিকে কোনও সংকীর্ণ করতে পারেন?
জেফ স্ক্যালার হলেন

আমি সম্পাদনাটি পছন্দ করি তবে সম্ভবত আপনিও লক্ষ্য করেছেন যে এখানে একটি উত্তর রয়েছে যা সর্বশেষ যুক্তিটি উল্লেখ করার জন্য একটি অ-ধ্বংসাত্মক উপায় সরবরাহ করে ...? আপনি সমার্থক করা উচিত নয় var=$( eval echo \${$#})থেকে eval var=\${$#}- দুই একইভাবে কিছু না।
মাইক্রজারভ

1
আমি আপনার শেষ নোটটি পেয়েছি তা নিশ্চিত নন তবে এখনও অবধি প্রদত্ত প্রায় সমস্ত উত্তরই সেই দিক থেকে চালানো স্ক্রিপ্ট আর্গুমেন্টগুলিকে সংরক্ষণ করে না এমনভাবে ধ্বংসাত্মক। কেবলমাত্র shiftএবং set -- ...ভিত্তিক সমাধানগুলি ক্ষতিকারক হতে পারে যদি না সেগুলি যেখানে ক্ষতিকারক হয় সেখানে ব্যবহার না করা।
jlliagre

@ জেলিয়াগ্রে - তবে তারা মূলত এখনও ধ্বংসাত্মক - তাদের নিষ্পত্তিযোগ্য প্রসঙ্গ তৈরি করা দরকার যাতে তারা আবিষ্কার করতে ধ্বংস করতে পারে। তবে ... যদি আপনি যাইহোক দ্বিতীয় প্রসঙ্গটি পান - তবে কেবল একটিটি কেন আপনাকে সূচকে অনুমতি দেয় না? কাজের জন্য লক্ষ্যযুক্ত সরঞ্জামটি ব্যবহার করে কিছু ভুল আছে? শেল সম্প্রসারণকে সম্প্রসারণযোগ্য ইনপুট হিসাবে ব্যাখ্যা করা ইওল এর কাজ। এবং eval "var=\${$#}"এটির গ্যারান্টিযুক্ত নিরাপদ মান var=${arr[evaled index]}ব্যতীত তুলনা করার সময় করার ক্ষেত্রে আলাদাভাবে কিছুই নেই nothing $#পুরো সেটটি অনুলিপি করুন কেন তখন এটি নষ্ট করবেন যখন আপনি কেবল এটি সরাসরি সূচক করতে পারেন?
মাইক্রজারভ

1
শেলটির মূল অংশে লুপের জন্য করা মিমকিজার এ এ সমস্ত যুক্তি অপরিবর্তিত রেখে চলেছে। আমি সম্মত হই যে সমস্ত আর্গুমেন্ট লুপ করা খুব আন-অপটিমাইজড, বিশেষত যদি এর হাজার হাজার শেলকে দেওয়া হয় এবং আমিও সম্মত হই যে সঠিক সূচক দিয়ে শেষ যুক্তিটি সরাসরি অ্যাক্সেস করা সর্বোত্তম উত্তর (এবং আমি বুঝতে পারি না কেন এটি নিম্নচালিত হয়েছিল ) তবে এর বাইরে, সত্যই ধ্বংসাত্মক কিছু নেই এবং কোনও অতিরিক্ত প্রসঙ্গ তৈরি করা হয়নি।
jlliagre

উত্তর:


1
eval printf %s${1+"'\n' \"the last arg is \${$#"\}\"}

... হয় স্ট্রিংয়ের the last arg isপরে <স্পেস> , শেষ আর্গুমেন্টের মান এবং একটি পেছনের < নিউ নিউলাইন> মুদ্রণ করবে যদি সেখানে কমপক্ষে 1 টি আর্গুমেন্ট থাকে, বা অন্যথায় শূন্য আর্গুমেন্টের জন্য এটি কিছুই মুদ্রণ করবে না।

যদি তুমি কর:

eval ${1+"lastarg=\${$#"\}}

... তাহলে হয় $lastargকমপক্ষে 1 টি আর্গুমেন্ট থাকলে শেল ভেরিয়েবলের কাছে আপনি সর্বশেষ যুক্তির মান নির্ধারণ করবেন , বা আপনি কিছু করবেন না। যেভাবেই হোক না কেন, আপনি এটি নিরাপদে করতে পারবেন, এবং এটি আপনার ওল্ড বোর্ন শেল এমনকি পোর্টেবল হওয়া উচিত I

এখানে অন্য একটি যা একইভাবে কাজ করবে, যদিও এটির জন্য পুরো আরগ অ্যারেটি দুবার অনুলিপি করা প্রয়োজন (এবং বোর্ন শেলটির জন্য একটি printfইন প্রয়োজন $PATH) :

if   [ "${1+:}" ]
then set "$#" "$@" "$@"
     shift    "$1"
     printf %s\\n "$1"
     shift
fi

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
টেরডন

2
এফওয়াইআই, আপনার প্রথম পরামর্শটি যদি কোনও যুক্তি না উপস্থিত থাকে তবে "খারাপ প্রতিস্থাপন" ত্রুটিযুক্ত উত্তরাধিকারী বোর্ন শেলের নিচে ব্যর্থ হয়। উভয়ই প্রত্যাশার মতো কাজ করে।
jlliagre

@ জিলাগ্রে - আপনাকে ধন্যবাদ আমি শীর্ষস্থানীয়টির বিষয়ে এতটা নিশ্চিত ছিলাম না - তবে অন্য দুজনের সম্পর্কে বেশ নিশ্চিত ছিলাম। এটি কেবলমাত্র রেফারেন্সের ইনলাইনে কীভাবে যুক্তিগুলি অ্যাক্সেস করা যেতে পারে তা প্রদর্শক হিসাবে বোঝানো হয়েছিল। সাধারণত কোনও ফাংশন ${1+":"} returnএখুনি মতো কিছু দিয়ে খোলা হবে - কারণ এটি চাইছে যে এটি কিছু করছে বা কোনও কারণের জন্য ডাকা না হলে কোনও ধরণের পার্শ্ব প্রতিক্রিয়া ঝুঁকির মধ্যে ফেলেছে? ম্যাথ এর জন্য খুব সুন্দর - আপনি যদি নিশ্চিত হতে পারেন যে আপনি একটি ইতিবাচক পূর্ণসংখ্যার প্রসারিত করতে পারেন তবে আপনি evalসারা দিন পারেন । $OPTINDএটির জন্য দুর্দান্ত।
মাইক্রজারভ

3

এখানে একটি সরল উপায়:

print_last_arg () {
  if [ "$#" -gt 0 ]
  then
    s=$(( $# - 1 ))
  else
    s=0
  fi
  shift "$s"
  echo "$1"
}

(@ কিউংলমের পয়েন্টের ভিত্তিতে আপডেট হয়েছে যে কোনও আর্গুমেন্ট পাস না করে মূল ব্যর্থ হয়েছিল; এটি এখন একটি ফাঁকা রেখা প্রতিপন্ন করে - ইচ্ছামত চাইলে ধারাটিতে সেই আচরণটি পরিবর্তন করুন else)


এটি সোলারিসে / usr / xpg4 / bin / sh ব্যবহার করা প্রয়োজন; সোলারিস #! / বিন / এস প্রয়োজন হয় তা আমাকে জানতে দিন।
জেফ স্ক্যালার হলেন

এই প্রশ্নটি কোনও নির্দিষ্ট স্ক্রিপ্টের বিষয়ে নয় যা আমি লেখার চেষ্টা করছি, বরং কীভাবে করতে হবে তা সাধারণ। আমি এটির জন্য একটি ভাল রেসিপি খুঁজছি। অবশ্যই, যত বেশি পোর্টেবল, তত ভাল।
kjo

সোলারিস / বিন / শিতে $ (()) গণিত ব্যর্থ হয়; এর মতো কিছু ব্যবহার করুন: শিফট `এক্সপ্রেস $ # - 1` এর প্রয়োজন হলে।
জেফ স্ক্যালার হলেন

বিকল্পভাবে সোলারিস / বিন / শ এর জন্যecho "$# - 1" | bc
জেফ শ্যাচলার

1
ঠিক এটাই আমি লিখতে চেয়েছিলাম, তবে আমি চেষ্টা করেছি ২ য় শেল - নেটবিএসডি, যা সম্ভবতঃ একটি অ্যালকুইস্ট শেল যা এটি সমর্থন করে না :(
জেফ শ্যাচলার

3

খোলার পোস্টের উদাহরণ দেওয়া (স্থান ছাড়াই অবস্থানগত যুক্তি):

print_last_arg foo bar baz

ডিফল্টর জন্য IFS=' \t\n', কীভাবে:

args="$*" && printf '%s\n' "${args##* }"

নিরাপদ সম্প্রসারণের জন্য "$*", আইএফএস সেট করুন (প্রতি @ স্টাফেনচাজেলাস):

( IFS=' ' args="$*" && printf '%s\n' "${args##* }" )

আপনার অবস্থানগত যুক্তিগুলিতে ফাঁক থাকতে পারে তবে উপরের অংশটি ব্যর্থ হবে। সেক্ষেত্রে পরিবর্তে এটি ব্যবহার করুন:

for a in "$@"; do : ; done && printf '%s\n' "$a"

নোট করুন যে এই কৌশলগুলি ব্যবহার এড়িয়ে যায় evalএবং এর কোনও পার্শ্ব-প্রতিক্রিয়া নেই।

শেলচেক.নেটে পরীক্ষা করা হয়েছে


1
প্রথম যুক্তিতে ব্যর্থ হলে শেষ যুক্তিতে স্থান থাকে।
কুওল্ম

1
নোট করুন যে প্রথমটি প্রি-
পসিক্স শেলটিতেও

@ কুওগলম ভালভাবে লক্ষ্য করা গেছে, আপনার সঠিক পর্যবেক্ষণটি এখনই সংযুক্ত করা হয়েছে।
AsymLabs

এটি ধরে নেয় প্রথম $IFSস্থানটি একটি স্থান।
স্টাফেন চেজেলাস

1
এটি যদি পরিবেশে কোনও $ আইএফএস না থাকে, অন্যথায় অনির্ধারিত থাকে। আপনি যেহেতু স্প্লিট + গ্লোব অপারেটরটি ব্যবহার করেন না কেন আপনাকে আইএফএসের ভার্চুয়াল সেট করতে হবে (বিস্তৃতভাবে ছাড়ুন না), আইএফএসের সাথে ডিল করার ক্ষেত্রে একটি পদ্ধতির দরকার যখনই আপনার প্রয়োজন হয় to এটি IFS=' 'এটির প্রসারণের জন্য ব্যবহৃত হচ্ছে তা পরিষ্কার করে দেওয়ার জন্য এখানে থাকার ক্ষতি হবে না "$*"
স্টাফেন চেজেলাস 24'16

3

যদিও এই প্রশ্নটি মাত্র 2 বছরের বেশি পুরানো, আমি ভেবেছিলাম কিছুটা কমপ্যাক্টর বিকল্পটি ভাগ করব।

print_last_arg () {
    echo "${@:${#@}:${#@}}"
}

এটি চালানো যাক

print_last_arg foo bar baz
baz

বাশ শেল প্যারামিটার সম্প্রসারণ

সম্পাদন করা

আরও সংক্ষিপ্ত: echo "${@: -1}"

(জায়গা মনে)

উৎস

ম্যাকোস 10.12.6 এ পরীক্ষা করা হয়েছে তবে বেশিরভাগ উপলভ্য * নিক্স স্বাদেও শেষ যুক্তিটি ফিরিয়ে দেওয়া উচিত ...

হার্ট অনেক কম ¯\_(ツ)_/¯


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আরও ভাল হবে: echo "${*: -1}"যা shellcheckসম্পর্কে অভিযোগ করবে না।
টম হেল

4
এটি সরল POSIX sh এর সাথে কাজ করবে না ${array:n:m:}এটি একটি এক্সটেনশন। (প্রশ্নটি স্পষ্টভাবে উল্লেখ করেছে /bin/sh)
ইলক্কাচু

2

POSIXly:

while [ "$#" -gt 1 ]; do
  shift
done

printf '%s\n' "$1"

(এই পদ্ধতির পুরানো বোর্ন শেলও কাজ করে)

অন্যান্য মানক সরঞ্জাম সহ:

awk 'BEGIN{print ARGV[ARGC-1]}' "$@"

(এটি পুরানো সাথে কাজ করবে না awk, যা ছিল না ARGV)


যেখানে এখনও বোর্ন শেল রয়েছে, awkসেই পুরানো বাজেও থাকতে পারে যা ছিল না ARGV
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস: সম্মত হন। কমপক্ষে এটি ব্রায়ান কার্নিগানের নিজস্ব সংস্করণ নিয়ে কাজ করেছিল। আপনার কোন আদর্শ আছে?
cuonglm

এটি যুক্তি মুছুন। কিভাবে তাদের রাখা ?.

@ বাইনারিজেব্রা: awkপদ্ধতিটি ব্যবহার করুন , বা অন্যের forমতো অন্যান্য সরল লুপ ব্যবহার করুন বা সেগুলিকে কোনও কার্যক্রমে প্রেরণ করুন।
cuonglm

2

এটি কোনও পসিক্স কমপ্লায়েন্ট শেল নিয়ে কাজ করা উচিত এবং পোসিক্স পূর্ববর্তী সোলারিস বোর্ন শেলটি নিয়ে খুব বেশি কাজ করবে:

do=;for do do :;done;printf "%s\n" "$do"

এবং এখানে একই পদ্ধতির উপর ভিত্তি করে একটি ফাংশন:

print_last_arg()
  if [ "$*" ]; then
    for do do :;done
    printf "%s\n" "$do"
  else
    echo
  fi

পিএস: আমাকে বলবেন না আমি ফাংশন বডির চারপাশে কোঁকড়ানো ধনুর্বন্ধনীগুলি ভুলে গেছি ;-)


2
আপনি ফাংশন বডি ;-) এর চারদিকে কোঁকড়া ধনুর্বন্ধনী ভুলে গেছেন।

@ বাইনারিজেব্রা আমি আপনাকে সতর্ক করে দিয়েছিলাম ;-) আমি সেগুলি ভুলে যাই নি। ধনুর্বন্ধনী এখানে আশ্চর্যজনকভাবে alচ্ছিক।
jlliagre

1
@ জিলিয়াগ্র্রে আমি আসলেই সতর্ক হয়েছিল ;-): পি ...... এবং: অবশ্যই!

সিনট্যাক্স স্পেকের কোন অংশটি এটির অনুমতি দেয়?
টম হেল

@ টমহেল শেল ব্যাকরণ নিয়ম দুটি ফাংশন বডি হিসাবে ব্যবহৃত একটি বিবৃতি ঘিরে in ...একটি forলুপ এবং একটি কোঁকড়ানো ধনুর্বন্ধনী উভয় অনুমতি দেয় if। দেখুন for_clauseএবং compound_commandমধ্যে pubs.opengroup.org/onlinepubs/9699919799
jlliagre

2

থেকে "ইউনিক্স - প্রায়শই জিজ্ঞাসা করা প্রশ্নাবলী"

(1)

unset last
if    [ $# -gt 0 ]
then  eval last=\${$#}
fi
echo  "$last"

যদি আর্গুমেন্টের সংখ্যা শূন্য হতে পারে, তবে আর্গুমেন্ট শূন্য $0(সাধারণত স্ক্রিপ্টের নাম) নির্ধারিত হবে $last। এই কারণ যদি।

(2)

unset last
for   last
do    :
done
echo  "$last"

(3)

for     i
do
        third_last=$second_last
        second_last=$last
        last=$i
done
echo    "$last"

কোনও যুক্তি না থাকলে খালি লাইন মুদ্রণ এড়াতে, এর echo "$last"জন্য প্রতিস্থাপন করুন :

${last+false} || echo "${last}"

একটি শূন্য আর্গুমেন্ট গণনা এড়ানো হয় if [ $# -gt 0 ]

এটি পৃষ্ঠায় লিঙ্কযুক্ত যা আছে তার সঠিক কপি নয়, কিছু উন্নতি যুক্ত করা হয়েছিল।


0

এটি perlইনস্টলড ( সমস্ত ইউনিক্সস) সহ সমস্ত সিস্টেমে কাজ করা উচিত :

print_last_arg () {
    printf '%s\0' "$@" | perl -0ne 's/\0//;$l=$_;}{print "$l\n"'
}

কৌতুক ব্যবহার করা printfএকটি যোগ করার জন্য \0প্রতিটি শেল যুক্তি এবং তারপর পরে perlএর -0সুইচ যা শূন্য তার রেকর্ড বিভাজক সেট করে। তারপরে আমরা ইনপুটটির উপর পুনরাবৃত্তি করব, \0প্রতিটি নুল-টার্মিনেটেড লাইনটি এটিকে সংরক্ষণ করি এবং সংরক্ষণ করি $lENDব্লক (যে কি এর }{শেষ শেল যুক্তি: হয়) পরে সমস্ত ইনপুট তাই পড়া হয়েছে গত "লাইনের" মুদ্রণ করবে মৃত্যুদন্ড কার্যকর করা হবে না।


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

হ্যাঁ, বাইরের এক্সিকিউটেবলকে ডেকে আনা (যদি এটি ইতিমধ্যে যুক্তির অংশ না হয়) তবে আমার কাছে কিছুটা ভারী। কিন্তু যদি বিন্দু উপর যুক্তি পাস হয় sed, awkঅথবা perlতারপর এটি মূল্যবান তথ্য যাহাই হউক না কেন হতে পারে। তবুও আপনি sed -zআপ টু ডেট GNU সংস্করণে একই কাজ করতে পারেন ।
মাইক্রজারভ

আপনি কেন পরাভূত হন? এই ভাল ছিল ... আমি ভেবেছি?
মাইক্রজারভ

0

পুনরাবৃত্তি ব্যবহার করে এখানে একটি সংস্করণ দেওয়া আছে। এটি কীভাবে পসিক্সের সাথে সামঞ্জস্যপূর্ণ তা কোনও ধারণা নেই ...

print_last_arg()
{
    if [ $# -gt 1 ] ; then
        shift
        echo $( print_last_arg "$@" )
    else
        echo "$1"
    fi
}

0

একটি সাধারণ ধারণা, কোনও পাটিগণিত, কোনও লুপ, কোনও খোলস , কেবল ফাংশন।
মনে রাখবেন বোর্ন শেলের কোনও গাণিতিক ছিল না (বাহ্যিক প্রয়োজন ছিল expr)। পাটিগণিত মুক্ত, evalনিখরচায় পছন্দ পেতে চাইলে এটি একটি বিকল্প। প্রয়োজন ফাংশনগুলির অর্থ এসভিআর 3 বা ততোধিক (পরামিতিগুলির ওভাররাইট নেই)।
প্রিন্টফের সাথে আরও দৃust় সংস্করণের জন্য নীচে দেখুন।

printlast(){
    shift "$1"
    echo "$1"
}

printlast "$#" "$@"          ### you may use ${1+"$@"} here to allow
                             ### a Bourne empty list of arguments,
                             ### but wait for a correct solution below.

কলে এই কাঠামো printlastহয় সংশোধন করা হয়েছে যুক্তি শেল আর্গুমেন্টের তালিকায় সেট করা প্রয়োজন $1, $2ইত্যাদি (যুক্তি স্ট্যাক) এবং কল সম্পন্ন হিসেবে দেওয়া।

যদি আর্গুমেন্টের তালিকাটি পরিবর্তন করতে হয় তবে কেবল সেগুলি সেট করুন:

set -- o1e t2o t3r f4u
printlast "$#" "$@"

অথবা ফাংশনটি ব্যবহার করার জন্য একটি সহজ তৈরি করুন ( getlast) যা জেনেরিক আর্গুমেন্টগুলিকে মঞ্জুরি দিতে পারে (তবে তত দ্রুত নয়, আর্গুমেন্ট দুটি বার পাস করা হয়)।

getlast(){ printlast "$#" "$@"; }
getlast o1e t2o t3r f4u

দয়া করে মনে রাখবেন যে আর্গুমেন্টগুলির ( getlastবা $@প্রিন্টলাস্টের জন্য অন্তর্ভুক্ত সমস্ত ) ফাঁকা স্থান, নিউলাইন ইত্যাদি থাকতে পারে তবে NUL নয়।

উত্তম

0আর্গুমেন্টের তালিকা খালি থাকলে এই সংস্করণটি মুদ্রণ করে না এবং আরও দৃust় প্রিন্টফ ব্যবহার করে ( পুরাতন শাঁসের জন্য echoবাহ্যিক printfউপলব্ধ না হলে ফিরে পড়ুন )।

printlast(){ shift  "$1"; printf '%s' "$1"; }
getlast  ()  if     [ $# -gt 0 ]
             then   printlast "$#" "$@"
                    echo    ### optional if a trailing newline is wanted.
             fi
### The {} braces were removed on purpose.

getlast 1 2 3 4    # will print 4

ইভাল ব্যবহার করা।

যদি বোর্ন শেলটি আরও পুরানো হয় এবং কোনও কার্যকারিতা না থাকে বা কোনও কারণে যদি ইভাল ব্যবহার করা হয় তবে একমাত্র বিকল্প:

মানটি মুদ্রণ করতে:

if    [ $# -gt 0 ]
then  eval printf "'1%s\n'" \"\$\{$#\}\"
fi

ভেরিয়েবলে মান সেট করতে:

if    [ $# -gt 0 ]
then  eval 'last_arg='\"\$\{$#\}\"
fi

যদি কোনও ফাংশনে এটি করা প্রয়োজন হয় তবে আর্গুমেন্টগুলি ফাংশনে অনুলিপি করা দরকার:

print_last_arg () {
    local last_arg                ### local only works on more modern shells.
    eval 'last_arg='\"\$\{$#\}\"
    echo "last_arg3=$last_arg"
}

print_last_arg "$@"               ### Shell arguments are sent to the function.

এটি আরও ভাল তবে এটি বলে যে একটি লুপ ব্যবহার করে না - তবে তা করে। একটি অ্যারে অনুলিপি একটি লুপ হয় । এবং দুটি ফাংশন সহ এটি দুটি লুপ ব্যবহার করে । এছাড়াও - পুরো অ্যারেটি পুনরাবৃত্তি করার কোনও কারণ রয়েছে যা এটির সাথে সূচককে অগ্রাধিকার দেওয়া উচিত eval?
মাইক্রজারভ

1
আপনি কোন দেখতে পাচ্ছেন for loopনাকি while loop?


1
আপনার স্ট্যান্ডার্ড অনুসারে, আমি অনুমান করি যে সমস্ত কোডের লুপ রয়েছে, এমনকি echo "Hello"সিপিইউকে একটি লুপে মেমরির অবস্থানগুলি পড়তে হবে বলে একটি লুপ রয়েছে। আবার: আমার কোডটিতে কোনও যুক্ত লুপ নেই।

1
আমি আপনার ভাল বা খারাপ সম্পর্কে মতামত সম্পর্কে সত্যিই মাথা ঘামাই না, এটি ইতিমধ্যে বেশ কয়েকবার ভুল প্রমাণিত হয়েছে। আবার: আমার কোডটিতে নেই for, whileবা untilলুপ রয়েছে। যদি আপনি কোন দেখতে পান কি for whileবা untilলুপ কোডে লেখা ?. না ?, তবে কেবল সত্যটি গ্রহণ করুন, এটি আলিঙ্গন করুন এবং শিখুন।

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