শেল স্ক্রিপ্টের ভিতরে একটি প্রোগ্রামে কমান্ড লাইন প্যারামিটারগুলি পাস করুন


15

হিসাবে ./script.sh arg1 [arg2 arg3 ...], কমান্ড লাইন আর্গুমেন্ট arg1, arg2... দ্বারা পাওয়া যেতে পারে $1, $2, ... কিন্তু আর্গুমেন্ট সংখ্যা নয় স্থির করেছি।

শেল স্ক্রিপ্টে, আমি arg2একটি প্রোগ্রাম থেকে শুরু করে যুক্তিগুলি পাস করতে চাই ,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

এক বা একাধিক যুক্তি থাকতে পারে তা আমি কীভাবে করব?

উত্তর:


17

সাধারণ উপায়টি হ'ল আরগ 1 ( "$1") এর অনুলিপি সংরক্ষণ এবং প্যারামিটারগুলি একে একে স্থানান্তরিত করা, যাতে আপনি পুরো তালিকাটি উল্লেখ করতে পারেন "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

বাশের অবশ্যই কিছু অ্যারে সমর্থন রয়েছে, তবে প্রশ্নের উত্থাপিত হিসাবে এটির প্রয়োজন নেই।

এমনকি arg1 alচ্ছিক হলেও আপনি এটির জন্য এটি পরীক্ষা করে দেখবেন:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi

ব্যবহারের সময় কি ডাবল উক্তিগুলি প্রয়োজনীয় $@?
লি

1
এর সাথে ডাবল-কোট $@শেলকে প্রতিটি প্যারামিটারকে ডাবল-কোট করতে বলেছে (প্যারামিটারগুলিতে বন্ধুত্বগুলি বা অ্যাসিরিস্টেসের মতো আকর্ষণীয় অক্ষর রয়েছে তবে করণীয় ভাল)। আপনি যদি $*
সেটির

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

10

প্যারামিটার সম্প্রসারণ ব্যবহার করে আপনি অবস্থানগত পরামিতিগুলি স্লাইস করতে পারেন। বাক্য গঠনটি হ'ল:

${parameter:offset:length}

যদি lengthবাদ দেওয়া হয় গত মান পর্যন্ত হিসাবে নেওয়া হয়।

আপনি যখন দ্বিতীয় থেকে শেষ যুক্তিগুলিতে যাচ্ছিলেন, আপনার প্রয়োজন:

${@:2}

উদাহরণ:

$ foo() { echo "${@:2}" ;}

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