কীভাবে আমি শেল স্ক্রিপ্টে একটি কমান্ড লাইন যুক্তিটি পাস করতে পারি?


241

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

উত্তর:


198

শেল কমান্ড এবং যে কমান্ড কোনো আর্গুমেন্ট প্রদর্শিত হিসাবে সংখ্যাযুক্ত শেল ভেরিয়েবল: $0, ভালো কিছু কমান্ড নিজেই স্ট্রিং মান আছে script, ./script, /home/user/bin/scriptবা যাই হোক না কেন। আর্গুমেন্টগুলি হিসাবে প্রদর্শিত "$1", "$2", "$3"ইত্যাদি। আর্গুমেন্টের গণনাটি শেল ভেরিয়েবলে "$#"

এটি মোকাবেলার সাধারণ উপায়গুলি শেল কমান্ডগুলি getoptsএবং জড়িত shiftgetoptsঅনেকটা সি getopt()লাইব্রেরির ফাংশনের মতো। shiftমান চলে আসে $2কাছে $1, $3থেকে $2, ইত্যাদি; $#হ্রাস পায়। কোডটি কোনও ক্রিয়া স্থির করার জন্য … "$1"ব্যবহার করে জিনিসগুলি করার মান এবং তারপরে পরবর্তী যুক্তিটিতে যাওয়ার জন্য একটি করণীয় সমাপ্ত করে । এটি কেবল কখনও পরীক্ষা করতে হবে , এবং হতে পারে ।caseesacshift$1$1$#


6
সি getopt()একটি অত্যন্ত প্রতিষ্ঠিত মান, তবে getoptএক্সিকিউটেবল ডিস্ট্রো / প্ল্যাটফর্ম জুড়ে একই হয় না। আমি এখন পুরোপুরি রূপান্তরিত getoptsব্যবহারকারী, কারণ এটি পসিক্স স্ট্যান্ডার্ড। dashএটিও দুর্দান্ত কাজ করে যা আমার পছন্দের স্ক্রিপ্ট শেল
জেএম বেকার

164

আর্গুমেন্ট নম্বরটি $nযেখানে nরয়েছে তার সাথে আপনি পাস হওয়া আর্গুমেন্টগুলিতে অ্যাক্সেস করতে পারেন 1, 2, 3, ...। আপনি অন্য কোনও কমান্ডের মতো আর্গুমেন্টগুলি পাস করেন।

$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world

27
$/shellscriptname.sh argument1 argument2 argument3 

আপনি একটি শেল স্ক্রিপ্টের আউটপুট অন্য শেল স্ক্রিপ্টের আর্গুমেন্ট হিসাবে পাস করতে পারেন।

$/shellscriptname.sh "$(secondshellscriptname.sh)"

শেল স্ক্রিপ্টের মধ্যে আপনি $1প্রথম আর্গুমেন্ট এবং $2দ্বিতীয় আর্গুমেন্ট ইত্যাদির মতো সংখ্যার সাথে যুক্তিগুলি অ্যাক্সেস করতে পারেন ।

শেল আর্গুমেন্ট আরও


18

ফর্ম

$ ./script.sh "$@" 

সবচেয়ে সুবিধাজনক জন্য argv। আরগ ডিলিমিটারটি সাদা স্থান, তবে পরিবর্তন করা যায়। কীভাবে বন্ধ মনে আছে। তারপরে ব্যবহার করুন

 $1, $2, shift, if [ $# -ne 3 ] 

প্রবাহ নিয়ন্ত্রণ করতে আমি সাধারণত গিপটপস আলিঙ্গন করি না যদি একটি case ... esacইচ্ছা যথেষ্ট হয়।


14

বাশ স্ক্রিপ্টে, আমি ব্যক্তিগতভাবে প্যারামিটারগুলি সেট করতে নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে চাই:

#!/bin/bash

helpFunction()
{
   echo ""
   echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
   echo -e "\t-a Description of what is parameterA"
   echo -e "\t-b Description of what is parameterB"
   echo -e "\t-c Description of what is parameterC"
   exit 1 # Exit script after printing help
}

while getopts "a:b:c:" opt
do
   case "$opt" in
      a ) parameterA="$OPTARG" ;;
      b ) parameterB="$OPTARG" ;;
      c ) parameterC="$OPTARG" ;;
      ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
   esac
done

# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
   echo "Some or all of the parameters are empty";
   helpFunction
fi

# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"

এই কাঠামোর সাহায্যে আমরা পরামিতিগুলির ক্রমের উপর নির্ভর করি না, কারণ আমরা তাদের প্রত্যেককে একটি মূল চিঠি নির্ধারণ করছি। এছাড়াও, সহায়তা কার্যটি প্যারামিটারগুলি ভুলভাবে সংজ্ঞায়িত করা হয় এমন সমস্ত সময়ে মুদ্রণ করা হবে। এটি হ্যান্ডেল করার জন্য বিভিন্ন পরামিতি সহ আমাদের প্রচুর স্ক্রিপ্ট থাকে যখন এটি খুব কার্যকর। এটি নিম্নলিখিত হিসাবে কাজ করে:

$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C

$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C

$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f

Usage: ./myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC

$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty

Usage: ./myscript -a parameterA -b parameterB -c parameterC
    -a Description of what is parameterA
    -b Description of what is parameterB
    -c Description of what is parameterC

13
./myscript myargument

myargument$1ভিতরে হয়ে যায় myscript


5

শেল স্ক্রিপ্টে; এটি পরিবর্তনশীল নাম হয়ে যায় $ 1। দ্বিতীয় শব্দটি ভেরিয়েবলের নাম $ 2 এবং আরও কিছু হয়।

cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world

Http://heirloom.sourceforge.net/sh/sh.1.html এ শেল (sh) ম্যানুয়ালটিতে আরও পাওয়া যাবে


2
U&L এ স্বাগতম, এটি ইতিমধ্যে প্রদত্ত উত্তরে খুব কমই যুক্ত করুন।
আর্চেমার

1

যদি আপনি পাইথন আরগপার্সের সাথে পরিচিত হন এবং বাশ আর্গুমেন্টগুলি পার্স করার জন্য পাইথনকে কল করতে আপত্তি করেন না তবে ব্যাশ আরগপার্স ( https://github.com/mattbryson/bash-arg-parse ) ব্যবহার করুন,

এখানে একই উত্তরটি দেখুন: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287


0
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null

------------------------------------------------------------------------

./scriptname.sh value1 value2

3
1) অপ্রয়োজনীয় 2> /dev/null, 2) বিদ্যমান উত্তরের সাথে কিছু যুক্ত করে না।
xenoid
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.