শেষ যুক্তিটি শেল স্ক্রিপ্টে পাস করা


272

$1প্রথম যুক্তি।
$@তাদের সব।

আমি কীভাবে শেল স্ক্রিপ্টে শেষ আর্গুমেন্টটি খুঁজে পেতে পারি?


আমি ব্যাশ ব্যবহার করছি, তবে আরও বহনযোগ্য সমাধান আরও ভাল।
টমাস


10
ব্যবহারটি $ {! # use
প্রীতেক যোশি

11
কেবল বাশের জন্য , কেভিন লিটলের উত্তরটি সহজ প্রস্তাব করে ${!#}। এটি ব্যবহার করে পরীক্ষা করুন bash -c 'echo ${!#}' arg1 arg2 arg3। জন্য ব্যাশ , ksh এবং zsh , ডেনিস উইলিয়ামসনের উত্তর প্রস্তাব ${@: -1}। তাছাড়াও ${*: -1}ব্যবহার করা যেতে পারে। এটি ব্যবহার করে পরীক্ষা করুন zsh -c 'echo ${*: -1}' arg1 arg2 arg3। তবে এটি ড্যাশ , সিএসএস এবং টিসিএসের জন্য কাজ করে না ।
অলিব্রে

2
${!#}, এর বিপরীতে ${@: -1}, প্যারামিটার বিস্তারের সাথেও কাজ করে। আপনি এটি দিয়ে পরীক্ষা করতে পারেন bash -c 'echo ${!#%.*}' arg1.out arg2.out arg3.out
আর্চ স্ট্যান্টন

উত্তর:


177

এটি হ্যাক একটি বিট:

for last; do true; done
echo $last

এটি একটি খুব পোর্টেবলও (আবার, ব্যাশ, কেএসএল এবং এসএইচ সঙ্গে কাজ করা উচিত) এবং এটি যুক্তিগুলি স্থানান্তরিত করে না, যা দুর্দান্ত হতে পারে।

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


10
@ মাইকেলরাজের, আমার ধারণা আপনারা কলোম না বরং কোলোনকে বোঝাতে চেয়েছিলেন;)
পাওয়ে নাদলসকি

2
@ মাইচারাজার পসিক্সের trueঅংশ
রাফলেউইন্ড

4
পুরানো বোর্ন শেল (পসিক্স নয়) সহ একটি পুরানো সোলারিসের সাথে, আমাকে "শেষ
অবধি

8
@ এমকুলিভ @ লরেন্সগলস আরও পোর্টেবল হওয়ার পাশাপাশি for last in "$@"; do :; doneঅভিপ্রায়টিকে আরও পরিষ্কার করে তোলে।
অ্যাড্রিয়ান গন্টার

1
@ এমকুলিভ: এটি ১৯৯৯ সাল থেকে ইউনিক্স ভি b বোনের শেলটিতেও কাজ করে it এটি ভি v এস এবং পসিএক্স এসএইচ উভয় ক্ষেত্রে চালিত হলে আপনি বেশি পোর্টেবল পেতে পারবেন না
ডমিনিক আর

291

এটি কেবল বাশ:

echo "${@: -1}"

43
যারা (আমার মত) ভাবছেন কেন স্থানটির প্রয়োজন কেন, মানব বাশকে এ সম্পর্কে বলতে হবে:> নোট করুন যে negativeণাত্মক অফসেটটি কমপক্ষে একটি স্পেস দ্বারা বিভ্রান্ত হওয়া থেকে বিরত থাকতে হবে: বিস্তৃতি।
ফু

1
আমি এটি ব্যবহার করে আসছি এবং এটি কেবল উইন্ডোতে এমএসওয়াইএস 2 ব্যাশে বিভক্ত হয়। উদ্ভট।
স্টিভেন লু

2
দ্রষ্টব্য: এই উত্তরটি সমস্ত বাশ অ্যারের জন্য কাজ করে, এর বিপরীতে ${@:$#}যা কেবলমাত্র কাজ করে $@। আপনি অনুলিপি হলে $@সঙ্গে একটি নতুন অ্যারেতে arr=("$@"), ${arr[@]:$#}অনির্ধারিত হবে। এর কারণ $@হল একটি 0 তম উপাদান যা "$@"বিস্তারে অন্তর্ভুক্ত নয় ।
মিঃ লালমা

@ মিঃল্লামা: এড়ানোর $#জন্য আরেকটি জায়গা হ'ল বাশ-এ অ্যারেগুলিকে পুনরুক্তি করা যখন অ্যারেগুলিতে কম থাকে তখন $#এটি অ্যারের উপাদানগুলির সংখ্যা দেখায় এটি অগত্যা শেষ উপাদানটির (বা উপাদান + 1) নির্দেশ করে না। অন্য কথায়, সূচিগুলির উপরে কারটি করা বা তার for ((i = 0; i++; i < $#)); do something "${array[$i]}"; doneপরিবর্তে for element in "${array[@]}"; do something "$element"; doneবা পুনরাবৃত্তি করা উচিত নয় : for index in "${!array[@]}"; do something "$index" "${array[$index]}"; doneযদি সূচকের মানগুলির সাথে আপনার কিছু করার প্রয়োজন হয়।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

80
$ set quick brown fox jumps

$ echo ${*: -1:1} # last argument
jumps

$ echo ${*: -1} # or simply
jumps

$ echo ${*: -2:1} # next to last
fox

স্থানটি প্রয়োজনীয় যাতে এটি একটি ডিফল্ট মান হিসাবে ব্যাখ্যা না হয়

মনে রাখবেন এটি কেবলমাত্র বাশ is


9
সেরা উত্তর, যেহেতু এটিতে শেষ আর্গের পরবর্তীটিও অন্তর্ভুক্ত রয়েছে। ধন্যবাদ!
e40

1
স্টিভেন, আমি জানি না আপনি পেনাল্টি বক্সে নামার জন্য কী করেছিলেন তবে আমি এখানে আপনার কাজকে ভালবাসি।
ব্রুনো ব্রোনোস্কি

4
হ্যাঁ. সধারনত সেরা. কমান্ড এবং শেষ যুক্তি ছাড়া সমস্ত ${@: 1:$#-1}
ডায়ানো ফু

1
@ ডায়নাফু তার জন্য আপনাকে ধন্যবাদ, আপনি আমার পরবর্তী প্রশ্নের উত্তর দিয়েছেন। সুতরাং একটি স্থান পরিবর্তন হতে পারে: echo ${@: -1} ${@: 1:$#-1}যেখানে সর্বশেষে প্রথম হয় এবং বাকী স্লাইডটি নিচে
মাইক

73

ব্যাশ 3.0.০ বা তার বেশি এর সহজ উত্তর

_last=${!#}       # *indirect reference* to the $# variable
# or
_last=$BASH_ARGV  # official built-in (but takes more typing :)

এটাই.

$ cat lastarg
#!/bin/bash
# echo the last arg given:
_last=${!#}
echo $_last
_last=$BASH_ARGV
echo $_last
for x; do
   echo $x
done

আউটপুট হল:

$ lastarg 1 2 3 4 "5 6 7"
5 6 7
5 6 7
1
2
3
4
5 6 7

1
$BASH_ARGVবাশ ফাংশনের ভিতরে কাজ করে না (যদি না আমি কিছু ভুল করি)।
বিগ ম্যাকলার্জহিউজ

1
BASH_ARGV এর আর্গুমেন্ট রয়েছে যখন বাশকে বলা হয়েছিল (বা কোনও ফাংশনে) অবস্থানিক আর্গুমেন্টের বর্তমান তালিকা নয়।
ইসহাক

BASH_ARGVআপনি যেটি প্রদান করবেন তা হ'ল নোটটি হ'ল "শেষ মান" এর পরিবর্তে সর্বশেষ আরগটি দেওয়া হয়েছিল was উদাহরণস্বরূপ!: যদি আপনি একটি একক যুক্তি সরবরাহ করেন তবে আপনি শিফটকে কল করুন, ${@:$#}কিছুই উত্পন্ন করবে না (কারণ আপনি একমাত্র এবং কেবলমাত্র যুক্তিটি সরিয়ে দিয়েছেন!) তবে, BASH_ARGVআপনাকে এটি (পূর্ববর্তী) শেষ যুক্তি দেবে।
স্টিভেন লু

30

দৈর্ঘ্যের সাথে মিলিত সূচী ব্যবহার করুন:

echo ${@:${#@}} 

মনে রাখবেন এটি কেবলমাত্র বাশ is



1
প্রতিধ্বনি $ (@ & $; & ^ $ &% @ ^! @% ^ # ** # & @ * # @ * # @ (& * # _ ** ^ @ ^ & (^ @ & * & @)
অতুল

29

নিম্নলিখিত আপনার জন্য কাজ করবে। @ টি আর্গুমেন্টের অ্যারে জন্য। : মানে এ। $ # হ'ল আর্গুমেন্টের অ্যারের দৈর্ঘ্য। সুতরাং ফলাফলটি সর্বশেষ উপাদান:

${@:$#} 

উদাহরণ:

function afunction{
    echo ${@:$#} 
}
afunction -d -o local 50
#Outputs 50

মনে রাখবেন এটি কেবলমাত্র বাশ is


উদাহরণটি কোনও ফাংশনের জন্য হলেও স্ক্রিপ্টগুলিও একইভাবে কাজ করে। আমি এই উত্তরটি পছন্দ করি কারণ এটি পরিষ্কার এবং সংক্ষিপ্ত is
জোনাহ ব্রাউন

1
এবং এটি হ্যাকি নয়। এটি ভাষার স্পষ্ট বৈশিষ্ট্যগুলি ব্যবহার করে, পার্শ্ব প্রতিক্রিয়া বা বিশেষ কিওয়ার্কস নয়। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
musicin3d 16

25

পূর্ববর্তী সমস্ত (গুলি) থেকে সর্বশেষ যুক্তি আলাদা করার জন্য যখন এটি পাওয়া গেছে। উত্তরগুলির মধ্যে কয়েকটি শেষ যুক্তিটি পেয়ে গেলেও আপনার অন্যান্য সমস্ত আর্গুমেন্টগুলির প্রয়োজন হলে সেগুলি খুব বেশি সহায়তা পাবে না। এটি আরও ভাল কাজ করে:

heads=${@:1:$#-1}
tail=${@:$#}

মনে রাখবেন এটি কেবলমাত্র বাশ is


3
স্টিভেন পেনি এর উত্তর ব্যবহার: একটি বিট সুন্দর হয় ${@: -1}জন্য গত এবং ${@: -2:1}জন্য দ্বিতীয় গত (ইত্যাদি ...)। উদাহরণ: bash -c 'echo ${@: -1}' prog 0 1 2 3 4 5 6কপি করে প্রিন্ট 6। এই বর্তমান AgileZebra এর পদ্ধতির সাথে থাকতে, দ্বিতীয় শেষ${@:$#-1:1} পেতে ব্যবহার করুন । উদাহরণ: কপি করে প্রিন্ট । (এবং তৃতীয়টি শেষ এবং আরও কিছু পেতে ...)bash -c 'echo ${@:$#-1:1}' prog 0 1 2 3 4 5 65${@:$#-2:1}
অলিবরে

4
AgileZebra এর উত্তর সর্বশেষ যুক্তি ছাড়া সমস্ত পাওয়ার একটি উপায় সরবরাহ করে তাই আমি বলব না যে স্টিভেনের উত্তর এটিকে ছাড়িয়ে যায়। তবে, $((...))1 টি বিয়োগের জন্য কোনও কারণ বলে মনে হয় না , আপনি কেবল ব্যবহার করতে পারেন ${@:1:$# - 1}
dkasak

ধন্যবাদ ডাকাশাক। আপনার সরলীকরণ প্রতিফলিত আপডেট।
AgileZebra

22

এটি সমস্ত পসিক্স-সামঞ্জস্যপূর্ণ শেলগুলিতে কাজ করে:

eval last=\${$#}

সূত্র: http://www.faqs.org/faqs/unix-faq/faq/part2/section-12.html


2
একটি পুরানো অভিন্ন উত্তরের সাথে যুক্ত এই মন্তব্যটি দেখুন ।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
সবচেয়ে সহজ পোর্টেবল সমাধান আমি এখানে দেখছি। @ ডেনিস উইলিয়ামসন, এটির কোনও সুরক্ষা সমস্যা নেই, অনুভূতভাবে উদ্ধৃতিটি সঠিকভাবে সম্পন্ন হয়েছে বলে মনে হচ্ছে যদি না $#স্বেচ্ছাচারী স্ট্রিংয়ে সেট করার কোনও উপায় না থাকে (আমি মনে করি না)। eval last=\"\${$#}\"এছাড়াও কাজ করে এবং স্পষ্টতই সঠিক। উদ্ধৃতিগুলির কেন দরকার নেই তা দেখুন না।
পেরেক

1
জন্য ব্যাশ , zsh , ড্যাশ এবং ksh eval last=\"\${$#}\" জরিমানা। তবে সিএসএস এবং টিসিএস ব্যবহারের জন্য eval set last=\"\${$#}\"। এই উদাহরণ দেখুন: tcsh -c 'eval set last=\"\${$#}\"; echo "$last"' arg1 arg2 arg3
অলিব্রে

12

এখানে আমার সমাধান:

  • সুন্দর পোর্টেবল (সমস্ত POSIX sh, bash, ksh, zsh) কাজ করা উচিত
  • আসল আর্গুমেন্টগুলি স্থানান্তরিত করে না (একটি অনুলিপি শিফট করে)।
  • মন্দ ব্যবহার করে না eval
  • পুরো তালিকার মাধ্যমে পুনরাবৃত্তি হয় না
  • বাহ্যিক সরঞ্জাম ব্যবহার করে না

কোড:

ntharg() {
    shift $1
    printf '%s\n' "$1"
}
LAST_ARG=`ntharg $# "$@"`

1
দুর্দান্ত উত্তর - সংক্ষিপ্ত, বহনযোগ্য, নিরাপদ। ধন্যবাদ!
জান লালিনস্কে

2
এটি দুর্দান্ত ধারণা, তবে আমার বেশ কয়েকটি পরামর্শ রয়েছে: প্রথমে উদ্ধৃতিটি চারপাশে "$1"এবং "$#"(এই দুর্দান্ত উত্তরটি unix.stackexchange.com/a/171347 দেখুন ) যোগ করা উচিত । দ্বিতীয়ত, echoদু: খজনকভাবে অ-বহনযোগ্য (বিশেষত এর জন্য -n), সুতরাং printf '%s\n' "$1"পরিবর্তে এটি ব্যবহার করা উচিত।
জোকি

ধন্যবাদ @ জোকি আমি বিভিন্ন বিভিন্ন ইউনিক্স সিস্টেমের সাথে কাজ করেছি এবং আমি বিশ্বাসও করব না echo -n, তবে কোনও পিক্সিক সিস্টেম যেখানে echo "$1"ব্যর্থ হবে সে সম্পর্কে আমি সচেতন নই । যাইহোক, printfপ্রকৃতপক্ষে আরও অনুমানযোগ্য - আপডেটেড।
মিচা Šরাজের

@ মাইকেলরাজের কেসটি বিবেচনা করুন যেখানে "$ 1" "-n" বা "-" রয়েছে, সুতরাং উদাহরণস্বরূপ ntharg 1 -nবা ntharg 1 --বিভিন্ন সিস্টেমে বিভিন্ন ফলাফল পেতে পারে। আপনার এখন কোডটি নিরাপদ!
জোকি

10

প্রাচীন থেকে নতুন সমাধানগুলিতে:

সর্বাধিক বহনযোগ্য সমাধান, এমনকি পুরানো sh(স্পেস এবং গ্লোব অক্ষরের সাথে কাজ করে) (কোনও লুপ নেই, দ্রুত):

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

ভার্সনের 2.01 সংস্করণ

$ set -- The quick brown fox jumps over the lazy dog

$ printf '%s\n'     "${!#}     ${@:(-1)} ${@: -1} ${@:~0} ${!#}"
dog     dog dog dog dog

Ksh, zsh এবং bash এর জন্য:

$ printf '%s\n' "${@: -1}    ${@:~0}"     # the space beetwen `:`
                                          # and `-1` is a must.
dog   dog

এবং "শেষের পরের" এর জন্য:

$ printf '%s\n' "${@:~1:1}"
lazy

কোনও ড্যাশ (যেমন -n) দিয়ে শুরু হওয়া আর্গুমেন্টগুলির সাথে কোনও সমস্যা সমাধানের জন্য প্রিন্টফ ব্যবহার করা ।

সমস্ত শেল এবং পুরোনোদের জন্য sh(স্পেস এবং গ্লোব অক্ষরের সাথে কাজ করে):

$ set -- The quick brown fox jumps over the lazy dog "the * last argument"

$ eval printf "'%s\n'" "\"\${$#}\""
The last * argument

অথবা, যদি আপনি কোনও lastভার সেট করতে চান :

$ eval last=\${$#}; printf '%s\n' "$last"
The last * argument

এবং "শেষের পরের" এর জন্য:

$ eval printf "'%s\n'" "\"\${$(($#-1))}\""
dog



3
shift `expr $# - 1`
echo "$1"

এটি আর্গুমেন্ট বিয়োগ 1 এর সংখ্যা দ্বারা আর্গুমেন্টগুলি স্থানান্তরিত করে এবং প্রথমটি (এবং কেবলমাত্র) বাকি আর্গুমেন্টটি দেয় যা শেষটি হবে।

আমি কেবল ব্যাশে পরীক্ষা করেছি, তবে এটি sh এবং ksh এও কাজ করা উচিত।


11
shift $(($# - 1))- বাহ্যিক ইউটিলিটির প্রয়োজন নেই। বাশ, ksh, zsh এবং ড্যাশে কাজ করে।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

@ ডেনিস: চমৎকার! আমি $((...))সিনট্যাক্স সম্পর্কে জানতাম না ।
লরেন্স গনসাল্ভেস

(যেমন ) এর printf '%s\n' "$1"থেকে অপ্রত্যাশিত আচরণ এড়াতে আপনি ব্যবহার করতে চান । echo-n
জোকি

2

আপনি যদি এটি একটি অ-ধ্বংসাত্মক উপায়ে করতে চান, তবে একটি উপায় হ'ল সমস্ত আর্গুমেন্ট কোনও ফাংশনে পাস করা এবং শেষটি ফিরে আসা:

#!/bin/bash

last() {
        if [[ $# -ne 0 ]] ; then
            shift $(expr $# - 1)
            echo "$1"
        #else
            #do something when no arguments
        fi
}

lastvar=$(last "$@")
echo $lastvar
echo "$@"

pax> ./qq.sh 1 2 3 a b
b
1 2 3 a b

আপনি যদি অন্য যুক্তিগুলি রাখার বিষয়ে আসলেই চিন্তা না করেন তবে আপনার কোনও ফাংশনে এটি দরকার নেই তবে এমন পরিস্থিতি নিয়ে আমার খুব কষ্ট হয় যখন আপনি ইতিমধ্যে অন্য প্রক্রিয়াগুলি প্রক্রিয়া না করা না হলে অন্য যুক্তিগুলি কখনই রাখতে চান না, সেক্ষেত্রে আমি ক্রমান্বয়ে প্রক্রিয়াজাতকরণ প্রক্রিয়া / শিফট / প্রক্রিয়া / শিফট / ... ব্যবহার করব।

আমি এখানে ধরে নিচ্ছি যে আপনি সেগুলি রাখতে চান কারণ আপনি অনুক্রমিক পদ্ধতি অনুসরণ করেন নি । এই পদ্ধতিটি এমন কেস পরিচালনা করে যেখানে কোনও যুক্তি নেই, ফিরে পাওয়া ""। মন্তব্য-আউট elseক্লজটি সন্নিবেশ করে আপনি সহজেই সেই আচরণটি সামঞ্জস্য করতে পারেন ।


2

টিসিএসের জন্য:

set X = `echo $* | awk -F " " '{print $NF}'`
somecommand "$X"

আমি নিশ্চিত যে এই অ্যাসাইনমেন্ট বাদে এটি একটি বহনযোগ্য সমাধান হবে be


আমি জানি আপনি এটি চিরতরে আগে পোস্ট করেছেন তবে এই সমাধানটি দুর্দান্ত - কেউ খুশি যে কেউ একটি টিসিএস পোস্ট করেছে!
ব্যবহারকারী3295674

2

আমি @ AgileZebra এর উত্তর (প্লাস @ স্টারফ্রাই এর মন্তব্য) সর্বাধিক দরকারী খুঁজে পেয়েছি তবে এটি headsএকটি স্কেলারে সেট হয়ে গেছে। একটি অ্যারে সম্ভবত আরও দরকারী:

heads=( "${@:1:$(($# - 1))}" )
tail=${@:${#@}}

মনে রাখবেন এটি কেবলমাত্র বাশ is


আপনি কীভাবে মাথাগুলিকে অ্যারে রূপান্তর করবেন?
স্টেফেন

আমি প্রথম বন্ধনী যুক্ত করে ইতিমধ্যে করেছি, উদাহরণস্বরূপ echo "${heads[-1]}"শেষ উপাদানটি প্রিন্ট করে heads। নাকি আমি কিছু মিস করছি?
এন্ডলসস্ক্লাইফ

1

একটি সমাধান ব্যবহার করে eval:

last=$(eval "echo \$$#")

echo $last

7
পরোক্ষ রেফারেন্সের জন্য Eval Overkill হয়, খারাপ অনুশীলন, এবং একটি বিশাল নিরাপত্তা উদ্বেগ (উল্লেখ না মান না উদ্ধৃতি প্রতিধ্বনি অথবা বাইরে $ () ব্যাশ পরোক্ষ রেফারেন্স, কোনো Var জন্য একটি builtin সিনট্যাক্স রয়েছে:। !তাই last="${!#}"একই ব্যবহার করেন । অভিগমন এবং অনেক নিরাপদ, কমপ্যাক্ট, builtin, বিবেকী ভাবে (পরোক্ষ $ # উপর রেফারেন্স) সঠিকভাবে উদ্ধৃত।
MestreLion

অন্য উত্তরে একই সম্পাদন করার একটি ক্লিনার উপায় দেখুন ।
পেরেক

@MestreLion এর উদ্ধৃতিগুলির আরএইচএসের প্রয়োজন নেই =
টম হালে

1
@ টমহেল: নির্দিষ্ট ক্ষেত্রে এটি সত্য ${!#}, তবে সাধারণভাবে নয়: যদি সামগ্রীতে আক্ষরিক সাদা অংশ থাকে তবে কোটগুলি এখনও আবশ্যক last='two words'$()বিষয়বস্তু নির্বিশেষে কেবল হোয়াইটস্পেস-নিরাপদ।
MestreLion

1

উপরের উত্তরগুলি পড়ার পরে আমি এক্সিকিউটেবল ইমেজ পিজিএম উত্পাদন করতে PGM.cpp এ জি ++ চালানোর জন্য একটি প্রশ্নোত্তর ডি শেল স্ক্রিপ্ট লিখেছিলাম (শি এবং বাশ নিয়ে কাজ করা উচিত)। এটি ধরে নেওয়া হয় যে কমান্ড লাইনের শেষ যুক্তিটি ফাইলের নাম (.cpp alচ্ছিক) এবং অন্যান্য সমস্ত আর্গুমেন্টই বিকল্প options

#!/bin/sh
if [ $# -lt 1 ]
then
    echo "Usage: `basename $0` [opt] pgm runs g++ to compile pgm[.cpp] into pgm"
    exit 2
fi
OPT=
PGM=
# PGM is the last argument, all others are considered options
for F; do OPT="$OPT $PGM"; PGM=$F; done
DIR=`dirname $PGM`
PGM=`basename $PGM .cpp`
# put -o first so it can be overridden by -o specified in OPT
set -x
g++ -o $DIR/$PGM $OPT $DIR/$PGM.cpp

1

নিম্নলিখিতটি LASTবর্তমান পরিবেশ পরিবর্তন না করে সর্বশেষ যুক্তি উপস্থাপন করবে :

LAST=$({
   shift $(($#-1))
   echo $1
})
echo $LAST

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

shift $(($#-1))
echo $1

অনুসরণযোগ্যতার কারণে নিম্নলিখিত:

shift $(($#-1));

এর সাথে প্রতিস্থাপন করা যেতে পারে:

shift `expr $# - 1`

$()আমরা পাই ব্যাককোটিসের সাথে প্রতিস্থাপন :

LAST=`{
   shift \`expr $# - 1\`
   echo $1
}`
echo $LAST

1
echo $argv[$#argv]

এখন আমার কেবল কিছু পাঠ্য যুক্ত করা দরকার কারণ আমার উত্তর পোস্ট করা খুব কম ছিল। সম্পাদনা করার জন্য আমাকে আরও পাঠ্য যুক্ত করতে হবে।


এটি কোন শেলটিতে কাজ করার জন্য অনুমান করা হয়? বাশ নয় মাছ নয় (আছে $argvতবে নেই $#argv- $argv[(count $argv)]ফিশে কাজ করে)।
বেনি চেরনিয়াভস্কি-পাসকিন

1

এটি আমার অনুলিপি ফাংশনের অংশ:

eval echo $(echo '$'"$#")

স্ক্রিপ্টগুলিতে ব্যবহার করতে, এটি করুন:

a=$(eval echo $(echo '$'"$#"))

ব্যাখ্যা (প্রথমে সবচেয়ে নেস্টেড):

  1. $(echo '$'"$#")পরামিতি সংখ্যা $[nr]যেখানে ফিরে [nr]। যেমন স্ট্রিং $123(অব্যবহৃত)।
  2. echo $123 মূল্যায়নের সময় 123 তম প্যারামিটারের মান প্রদান করে returns
  3. evalকেবলমাত্র $123প্যারামিটারের মান পর্যন্ত প্রসারিত হয় last_arg। এটি স্ট্রিং হিসাবে ব্যাখ্যা করা হয়েছে এবং ফিরে এসেছে।

২০১৫ সালের মাঝামাঝি পর্যন্ত বাশের সাথে কাজ করে।


খোলামেলা পদ্ধতির ইতিমধ্যে এখানে অনেকবার উপস্থাপন করা হয়েছে, তবে এটি কীভাবে কাজ করে তার একটি ব্যাখ্যা রয়েছে। আরও উন্নত করা যেতে পারে, তবে এখনও রাখা মূল্যবান।
প্লেক

0
#! /bin/sh

next=$1
while [ -n "${next}" ] ; do
  last=$next
  shift
  next=$1
done

echo $last

যদি কোনও যুক্তি খালি স্ট্রিং হয় তবে এটি ব্যর্থ হবে, তবে 99.9% ক্ষেত্রে কাজ করবে।
টমাস

0

শেষ তর্কটি খুঁজে পেতে নীচের স্ক্রিপ্টটি ব্যবহার করে দেখুন

 # cat arguments.sh
 #!/bin/bash
 if [ $# -eq 0 ]
 then
 echo "No Arguments supplied"
 else
 echo $* > .ags
 sed -e 's/ /\n/g' .ags | tac | head -n1 > .ga
 echo "Last Argument is: `cat .ga`"
 fi

আউটপুট:

 # ./arguments.sh
 No Arguments supplied

 # ./arguments.sh testing for the last argument value
 Last Argument is: value

ধন্যবাদ।


আমার সন্দেহ হয় এটি। /Arguments.sh "শেষ মান"
টমাস

থমাস যাচাই করার জন্য আপনাকে ধন্যবাদ, আমি নিজের মতো স্ক্রিপ্ট হিসাবে সম্পাদনা করার চেষ্টা করেছি # ./arguments.sh "শেষ মান" শেষ যুক্তি: মান এখন ঠিকঠাক কাজ করছে। # ./arguments.sh "দ্বিগুণ সহ সর্বশেষ মান চেক" শেষ যুক্তিটি হ'ল: দ্বিগুণ
রঞ্জিতকুমার T

সমস্যাটি হ'ল শেষ যুক্তিটি ছিল 'সর্বশেষ মান', এবং মান নয়। ত্রুটিটি স্থান যুক্তি যুক্তির কারণে ঘটে।
টমাস

0

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

  argArray=( "$@" )                        # Add all script arguments to argArray
  arrayLength=${#argArray[@]}              # Get the length of the array
  lastArg=$((arrayLength - 1))             # Arrays are zero based, so last arg is -1
  echo ${argArray[$lastArg]}

নমুনা আউটপুট

$ ./lastarg.sh 1 2 buckle my shoe
shoe

0

প্যারামিটার সম্প্রসারণ ব্যবহার করে (মিলিত সূচনা মুছুন):

args="$@"
last=${args##* }

শেষের আগে সব পাওয়াও সহজ:

prelast=${args% *}

সম্ভাব্য (দরিদ্র) প্রতিলিপি stackoverflow.com/a/37601842/1446229
Xerz

এটি কেবল তখনই কাজ করে যদি শেষ যুক্তিতে কোনও স্থান না থাকে।
প্যালেক

আপনার প্রিস্টাল্ট ব্যর্থ হয় যদি শেষ যুক্তিটি একটি বাক্য যা ডাবল উদ্ধৃতিতে আবদ্ধ থাকে, সেই বাক্যটিকে একটি যুক্তি বলে মনে করা হয়।
স্টিফেন

0

সর্বাধিক ব্যবহৃত কমান্ডের শেষ যুক্তিটি ফিরিয়ে আনতে বিশেষ প্যারামিটারটি ব্যবহার করুন:

$_

এই উদাহরণস্বরূপ এটি কাজ করবে যদি এটি স্ক্রিপ্টের মধ্যে অন্য কমান্ড চালিত হওয়ার আগে ব্যবহার করা হয়।


এটি প্রশ্নটি যা জিজ্ঞাসা করছে তা নয়
retnikt

-1

শুধু ব্যবহার !$

$ mkdir folder
$ cd !$ # will run: cd folder

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