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


97

বাশ স্ক্রিপ্টে কমান্ড লাইন আর্গুমেন্টগুলি পরিবর্তন করার কোনও উপায় আছে? উদাহরণস্বরূপ, বাশ স্ক্রিপ্টটি এই জাতীয়ভাবে আহ্বান করা হয়েছে:

./foo arg1 arg2  

স্ক্রিপ্টের মধ্যে আরগ 1 এর মান পরিবর্তন করার কোনও উপায় আছে কি? কিছুটা এইরকম:

$1="chintz"

উত্তর:


153

আপনাকে সমস্ত যুক্তি পুনরায় সেট করতে হবে। উদাহরণস্বরূপ $3:

$ set -- "${@:1:2}" "new" "${@:4}"

মূলত আপনি সমস্ত যুক্তি তাদের বর্তমান মানগুলিতে সেট করেছেন , আপনি যে পরিবর্তন করতে চান সেগুলি (গুলি) ব্যতীত। POSIX 7 দ্বারাও নির্দিষ্ট করা আছেset --

"${@:1:2}"স্বরলিপি দুই প্রসারিত হয় (অত: পর 2স্বরলিপি) অফসেট অবস্থানগত থেকে শুরু আর্গুমেন্ট 1(অর্থাত $1)। এটি "$1" "$2"এই ক্ষেত্রে একটি সংক্ষিপ্তকরণ, তবে আপনি উদাহরণস্বরূপ প্রতিস্থাপন করতে চাইলে এটি আরও বেশি কার্যকর "${17}"


4
সুতরাং, $ 3 পরিবর্তন করতে, আমাকে অবশ্যই $ 1 এবং $ 2 পরিবর্তন করতে হবে, তাই না? এবং তাদের কি পরিবর্তন? "রিসেট" এর অর্থ কী?
শ্রীরাম

কৌতুক জন্য ধন্যবাদ! এম্বেড থাকা স্পেস সহ ফাইলের নামগুলির জন্য এটি ব্যবহার করতে আমার অসুবিধা হয়েছিল। অন্য কেউ যে সমস্যা পাতিত পারে, তাদের নির্বাণ চেষ্টা evalপ্রতি লাইনে সামনে এই
cxw

4
আপনি যে প্যারামিটারটি পরিবর্তন করতে চান তার অবস্থানটি জানলে এটি ঠিক আছে। আপনি যদি বাস্তবে এটি জানেন না এবং এটিকে পরিবর্তনশীল করার দরকার হয় তবে কী হবে? আমি $ সেট - "$ {: 1: $ পিভট}" দিয়ে চেষ্টা করেছি তবে এটি সেখানে কোনও পরিবর্তনশীল গ্রহণ করে না।
ড্যানিয়েলে সেগাটো

4
কোনও ফাংশনের ভিতরে থেকে আমি কীভাবে একই কাজ করতে পারি? কোনও ফাংশনের অভ্যন্তর থেকে ডাকা হলে আপনার সমাধানটি কাজ করে না বলে মনে হয়।
হাশকেন

4
আপনি কোনও ফাংশনের মধ্যে থেকে কোনও স্ক্রিপ্টের অবস্থানগত পরামিতিগুলি পরিবর্তন করতে পারবেন না - ফাংশনের নিজস্ব যুক্তিগুলি সেগুলি আড়াল করে। আপনি তবে এগুলি একটি অ্যারেতে সঞ্চয় করতে পারেন এবং এটিতে কাজ করতে পারেন।
ঠাকলা

23

সামর্থ্য এবং রক্ষণাবেক্ষণের জন্য অনুকূলিতকরণ, আপনি নির্ধারণ করা $1এবং $2আরও অর্থপূর্ণ ভেরিয়েবলগুলি (আমি জানি না, input_filename = $1এবং output_filename = $2বা কোনও কিছু) ভাল করতে পারেন এবং তারপরে input_filename = 'chintz'স্ক্রিপ্টটির ইনপুটটি অপরিবর্তিত রেখে, সেইগুলির মধ্যে একটিতে ওভাররাইট করা ( স্ক্রিনে) থাকতে পারে in অন্য কোথাও দরকার


আমি এমন একটি দৃষ্টিভঙ্গি চেয়েছিলাম যেখানে আমি নিজেই ইনপুট আর্গুমেন্টগুলির মধ্যে একটি পরিবর্তন করতে পারি। আমার এটি করা দরকার যেহেতু আমি স্ক্রিপ্ট থেকে কোনও মান ফিরিয়ে দিতে চেয়েছিলাম। থাকালার দেওয়া উত্তরটি ভাল কাজ করেছে। উত্তরের জন্য ধন্যবাদ!!!
শ্রীরাম

4
@ জনসইয়েব একমত পঠনযোগ্যতার জন্য, আপনার আরও ভাল পদ্ধতি।
ডিএসএস

4
"আপনি ভাল আছেন" সর্বদা ব্যবহারের ক্ষেত্রে নির্ভর করে যা সরবরাহ করা হয় না।
তাঁকে

4
@ স্কট আমি এই উত্তরটি লেখার সময় আমার চেয়ে years বছরের বেশি বয়সী এবং আরও বেশি অভিজ্ঞতা, আমি আপনার সাথে একমত হতে আগ্রহী।
জনসিওয়েব

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

0

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


    # set defaults for the passed arguments (if any) if not defined.
    #
    arg1=${1:-"default-for-arg-1"}
    arg2=${2:-"default-for-arg-2"}
    set -- "${arg1}" "${arg2}"
    unset arg1 arg2

আমি আশা করি এটি অন্য কারও কাজে আসবে।

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