বাশ বা শেল স্ক্রিপ্টে ফরোয়ার্ড ফাংশন ঘোষণা?


97

bashউদাহরণস্বরূপ, সি / সি ++ তে সুপরিচিত, ফরওয়ার্ড ডিক্লেয়ারেশনের মতো কিছু আছে বা কমপক্ষে অনুরূপ কিছু (কাজের আশেপাশে) রয়েছে কি?

বা এরকম কিছু আছে কারণ উদাহরণস্বরূপ এটি সর্বদা একটি পাসে সঞ্চালিত হয় (লাইনের পরে লাইন)?

যদি কোনও ফরওয়ার্ড ডিক্লেয়ারেশন না থাকে তবে আমার স্ক্রিপ্টটি পড়া সহজ করার জন্য আমার কী করা উচিত। এটি বরং দীর্ঘ এবং এই ফাংশন সংজ্ঞাগুলির শুরুতে, বৈশ্বিক ভেরিয়েবলগুলির সাথে মিশ্রিত করা, আমার স্ক্রিপ্টটি দেখতে খারাপ দেখতে এবং পড়তে / বুঝতে অসুবিধে হয়)? আমি এই জাতীয় ক্ষেত্রে কিছু সুপরিচিত / সেরা অনুশীলন শিখতে বলছি।


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

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}

উত্তর:


191

দুর্দান্ত প্রশ্ন। আমি আমার বেশিরভাগ স্ক্রিপ্টগুলির জন্য এর মতো একটি প্যাটার্ন ব্যবহার করি:

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"

আপনি উপর থেকে নীচে কোডটি পড়তে পারেন, তবে এটি শেষ পংক্তির অবধি কার্যকর করা শুরু করে না। পাশ দিয়ে "$@"প্রধান করার জন্য () আপনি কমান্ড লাইন আর্গুমেন্ট অ্যাক্সেস করতে পারেন $1, $2, এট ঠিক যেমন আপনি সাধারণতঃ হবে।


4
হাই, উদাহরণস্বরূপ foo / bar / baz এর মধ্যে ভাগ করা ডেটা আপনি কীভাবে গঠন করেন? সাধারণত আমি এটি স্ক্রিপ্টের শীর্ষে রাখি। ফাংশন ব্যবহার করার পরেও কি এই অবস্থাটি রয়েছে? বা বৈশ্বিক ডেটা মূলত রাখার চেয়ে ভাল, এবং তারপরে এটিকে আর্গুমেন্ট হিসাবে ফু / বার / বাজে দেওয়া উচিত? সেরা অনুশীলন কি?
বোড্যাসিডো

4
আমি যুক্তি পছন্দ করি তা বাদ দিয়ে, আমি mainঠিক পরে বা main(যেমন, setupবা parseArguments) কোনও ফাংশনে বা বৈশ্বিক ভেরিয়েবলগুলি সেট করব । আমি উপরে গ্লোবাল ভেরিয়েবলগুলি সেট করা এড়ানো main- কোডের বাইরে যাওয়া উচিত নয় main
জন কুগেলম্যান

এটি if _ _ name _ _ == "_ _ main _ _": main()
অজগরটিতে

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

31

আমার বাশ স্ক্রিপ্টগুলি যখন খুব বেশি বৃদ্ধি পায় তখন আমি একটি অন্তর্ভুক্ত প্রক্রিয়া ব্যবহার করি:

ফাইল allMyFunctions:

foo() {
}

bar() {
}

baz() {
}

ফাইল main:

#!/bin/bash

. allMyfunctions

foo
bar
baz

28
ব্যক্তিগতভাবে, যখন কোনও শেল স্ক্রিপ্ট একটি ফাইলের অতীতে বাড়তে শুরু করে, আমি অন্য ভাষায় স্যুইচ করার প্রবণতা করি ;-)
জোচিম সৌর

এটি ব্যবহার করা ভাল না source allMyfunctions?
পাইডোজ

4
@pydoge: পসিক্স source-কমপ্লায়েন্ট নয়। একটি উপাধি হিসাবে এটি bashসংজ্ঞা sourceদেয় .: এগুলি কার্যত সমতুল্য।
mouviciel
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.