কিভাবে একটি ফাংশন ভিতরে কলারের কমান্ড লাইন আর্গুমেন্ট অ্যাক্সেস করতে?


102

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

# Demo function
function stuff {
  echo $0 $*
}

# Echo's the name of the script, but no command line arguments
stuff

# Echo's everything I want, but trying to avoid
stuff $*

4
আমি এক ধরনের বিভ্রান্ত, আপনি কি তাদের পাস দিয়ে আর্গুমেন্ট চান?
রবি ব্যাস

4
হ্যাঁ, বিন্দুটি হ'ল কোনও ফাংশনটির ভিতরে থেকে কমান্ড লাইন আর্গুমেন্টগুলি ফাংশনাল আর্গুমেন্ট হিসাবে পাস না করেই পাওয়া যায়। এটি একটি ত্রুটি পরিচালনার পরিস্থিতি নিয়ে করতে হবে যেখানে আমি ফাংশনে প্রেরণ করা আর্গুমেন্টগুলির স্বাধীনভাবে কমান্ড লাইন যুক্তির উপর ভিত্তি করে ত্রুটি পরিচালনা করতে চাই ling
ডোনগার

অবগতির জন্য, $*অত্যন্ত বগী - এটা পরিবর্তন করব ./yourScript "first argument" "second argument"করার ./yourscript "first" "argument" "second" "argument", পরিবর্তন বা ./yourscript '*.txt'ভালো কিছু করার জন্য ./yourscript one.txt two.txtকোট সত্ত্বেও।
চার্লস ডাফি

উত্তর:


48

আমার বাশ রেফার ম্যানুয়ালটি পড়তে বলা হয়েছে যে এই জিনিসগুলি BASH_ARGV- তে ধরা পড়েছে, যদিও এটি "স্ট্যাক" সম্পর্কে অনেক কথা বলে।

#!/bin/bash

function argv {
    for a in ${BASH_ARGV[*]} ; do
      echo -n "$a "
    done
    echo
}

function f {
    echo f $1 $2 $3
    echo -n f ; argv
}

function g {
    echo g $1 $2 $3
    echo -n g; argv
    f
}

f boo bar baz
g goo gar gaz

F.sh এ সংরক্ষণ করুন

$ ./f.sh arg0 arg1 arg2
f boo bar baz
farg2 arg1 arg0 
g goo gar gaz
garg2 arg1 arg0 
f
farg2 arg1 arg0 

5
মনে রাখবেন যে অ্যারেটি এর মতো ইট্রেটেটিং করার ফলে আদেশগুলি কমান্ড লাইন থেকে বিপরীত ক্রমে চলে আসে।
অ্যান্ড্রু ব্যাকার

96

আপনি যদি নিজের যুক্তি সি স্টাইল করতে চান (আর্গুমেন্টের অ্যারে + আর্গুমেন্টের সংখ্যা) আপনি ব্যবহার করতে পারেন $@এবং$#

$#আপনাকে আর্গুমেন্টের সংখ্যা দেয়।
$@আপনাকে সমস্ত যুক্তি দেয়। আপনি এটি দ্বারা একটি অ্যারে রূপান্তর করতে পারেন args=("$@")

উদাহরণস্বরূপ:

args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}

মনে রাখবেন যে এখানে ${args[0]}আসলে 1 তর্ক এবং আপনার স্ক্রিপ্টের নাম নয়।


5
এটি প্রশ্নের সমাধান করে না - এটি শেল ফাংশন সহ কমান্ড-লাইন আর্গুমেন্টগুলি পাস করার বিষয়ে জিজ্ঞাসা করছে।
ক্যাসাবেল

6
@ জেফ্রমি, আসলে, এটি প্রশ্নের পুরোপুরি উত্তর দেয়। আপনি argsকোনও ফাংশনটির ভিতরে থেকে অ্যারেটি ব্যবহার করতে পারেন , যদি আপনি আগে থেকে বর্ণিত হিসাবে এটি আরম্ভ করেন।
ভাদপ্প

4
আমি আর্গুমেন্টগুলি দিয়ে পুনরাবৃত্তি করার চেয়ে অনেক ক্লিনার পেয়েছি।
ফলিক্স গাগনন-গ্রেনিয়ার

4
এটি সহজ এবং সহজ। দুর্দান্ত উত্তর। আপনি 7 বছর আগে এটি পোস্ট করেছেন, তাই ভবিষ্যত থেকে হ্যালো: জুলাই 2017
এসডসোলার

আরও ভাল যেমন উদ্ধৃত করা হবে echo "${args[0]} ${args[1]} ${args[2]}", বা যুক্তি ফাইল নাম প্রসারিত সাপেক্ষে।
বেনিয়ামিন ডব্লিউ।

18
#!/usr/bin/env bash

echo name of script is $0
echo first argument is $1
echo second argument is $2
echo seventeenth argument is $17
echo number of arguments is $#

সম্পাদনা: প্রশ্নে আমার মন্তব্য দেখুন


17

রবির মন্তব্যটি মূলত এর উত্তর। ফাংশনগুলি তাদের নিজস্ব যুক্তি গ্রহণ করে। আপনি যদি সেগুলি কমান্ড-লাইন আর্গুমেন্টের মতো হতে চান তবে আপনাকে অবশ্যই এটি প্রবেশ করতে হবে Otherwise

এটি বলেছিল, আপনি যদি অন্য ক্রিয়াকলাপের মধ্যে ব্যবহারের জন্য বিশ্বব্যাপী অ্যারেতে কমান্ড-লাইন আর্গুমেন্টগুলি সঞ্চয় করতে চান:

my_function() {
    echo "stored arguments:"
    for arg in "${commandline_args[@]}"; do
        echo "    $arg"
    done
}

commandline_args=("$@")

my_function

আপনি মাধ্যমে কমান্ড লাইন আর্গুমেন্ট অ্যাক্সেস আছে commandline_argsপরিবর্তনশীল, না $@, $1,$2 , ইত্যাদি, কিন্তু তারা উপলব্ধ। আর্গুমেন্ট অ্যারেতে সরাসরি নির্ধারণের কোনও উপায় সম্পর্কে আমি অসচেতন, তবে কেউ যদি কেউ জানেন তবে দয়া করে আমাকে আলোকিত করুন!

এছাড়াও, আমি যেভাবে ব্যবহার করেছি এবং উদ্ধৃতি দিয়েছি তা নোট করুন $@- আপনি কীভাবে বিশেষ অক্ষরগুলি (সাদা স্থান) কুঁচকানো না তা নিশ্চিত করেন।


6
# Save the script arguments
SCRIPT_NAME=$0
ARG_1=$1
ARGS_ALL=$*

function stuff {
  # use script args via the variables you saved
  # or the function args via $
  echo $0 $*
} 


# Call the function with arguments
stuff 1 2 3 4

2

কেউ এটির মতো এটিও করতে পারে

#!/bin/bash
# script_name function_test.sh
function argument(){
for i in $@;do
    echo $i
done;
}
argument $@

এখন আপনার স্ক্রিপ্ট কল করুন

./function_test.sh argument1 argument2

function print() {দুটি পৃথক ফাংশন ডিক্লারেশন ফর্মগুলির মধ্যে একটি সংমিশ্রণ - function print {যা লেগ্যাসি ksh সিনট্যাক্স যা ব্যাশ প্রাক-পসিক্সের সাথে পিছনের সামঞ্জস্যের জন্য সমর্থন করে (যা বলা হয় প্রাক-1991) ksh, এবং print() {, যা পসিক্স-স্ট্যান্ডার্ডাইজড। অন্যান্য শেলগুলির সাথে আরও বিস্তৃত সামঞ্জস্যের জন্য এক বা অন্যটিকে ব্যবহার করার কথা বিবেচনা করুন; আরও দেখুন wiki.bash-hackers.org/scripting/obsolete
চার্লস ডাফি

1

এগুলির মাধ্যমে পুনরাবৃত্তি করতে আপনি শিফট কীওয়ার্ড (অপারেটর?) ব্যবহার করতে পারেন। উদাহরণ:

#!/bin/bash
function print()
{
    while [ $# -gt 0 ]
    do
        echo $1;
        shift 1;
    done
}
print $*;

4
function print() {দুটি পৃথক ফাংশন ডিক্লারেশন ফর্মগুলির মধ্যে একটি সংমিশ্রণ - function print {এটি হ'ল লিগ্যাসি ksh সিনট্যাক্স যা ব্যাশ প্রাক-পসিক্সের সাথে পিছনের সামঞ্জস্যের জন্য সমর্থন করে (যা বলা হয় প্রাক-1991) ksh, এবং print() {, যা পসিক্স-মানকযুক্ত। অন্যান্য শেলগুলির সাথে আরও বিস্তৃত সামঞ্জস্যের জন্য এক বা অন্যটিকে ব্যবহার করার কথা বিবেচনা করুন; আরও দেখুন wiki.bash-hackers.org/scripting/obsolete
চার্লস ডাফি

1

আমার সমাধান:

কোনও ফাংশন স্ক্রিপ্ট তৈরি করুন যা এর আগে কোনও যুক্তি ছাড়াই অন্য ফাংশনগুলির চেয়ে আগে বলা হয়:

! / বিন / বাশ

ফাংশন init () {ORIGOPT = "- $ @ -"}

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

এটিকে 'সেড-ই' দিয়ে পার্স করা আরও সহজ করার জন্য আমি স্পেস এবং ড্যাশ যুক্ত করেছি যাতে বাশ এটিকে রেফারেন্স হিসাবে পাস করবে না এবং ফাংশনগুলিকে আরও যুক্তিযুক্ত হিসাবে ডাকা হয় বলে ওআইআরআইজিপিটি বৃদ্ধি পাবে না।

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