কোনও ফাংশনে $ 1 কেন স্ক্রিপ্টের প্রথম যুক্তিটি মুদ্রণ করছে না?


13

কেন এই সাধারণ বাশ স্ক্রিপ্টে echo $1মুদ্রণ হয় না $1?

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

6
কারণ আপনি মুদ্রণ_সামান্য কিছু কল করার সময় $ 1 ভুলে গেছেন। শিরোনামে নয়, প্রশ্নে পাঠ্য অন্তর্ভুক্ত করার চেষ্টা করুন।
রুই এফ রিবেইরো

ধন্যবাদ। যদি স্ক্রিপ্টে কমান্ডগুলি সন্নিবেশ করানো হয় তবে প্রতিধ্বনি যুক্তিটি কী হওয়া উচিত: মুদ্রণ_সামান্য "$ 1"; মুদ্রণ_সামান্য "$ 2"; এবং সম্ভবত আরও?
পিট্রো লেটি

13
আমি যখন এইচএনকিউতে দেখেছি তখন আমি ভেবেছিলাম আপনি ডলার-বিল মুদ্রণ করছেন এবং আপনার প্রিন্টার কীভাবে সনাক্ত করে যে আপনি জাল টাকা মুদ্রণ করছেন তা সম্পর্কে কিছু সরস গল্প পড়তে আশা করি।
পাইপ

@ পাইপ আমার আগে যা ঘটেছিল তা আমার হয়েছে, কোনও কারণে এটি মুদ্রণবিরোধী প্রতিরোধগুলি কেবলমাত্র কিছু মুদ্রণ করতে অস্বীকার করে।
কোডিংলে

উত্তর:


41

অবস্থানগত প্যারামিটারগুলি স্ক্রিপ্টের মূল স্তরের স্ক্রিপ্টের আর্গুমেন্টগুলিকে বোঝায় তবে ফাংশন বডিতে আর্গুমেন্টগুলি ফাংশন করতে। সুতরাং

print_something Something

আসলে মুদ্রণ হবে Something

আপনি যদি স্ক্রিপ্টের যুক্তিগুলি কোনও ফাংশনে পাস করতে চান তবে আপনাকে অবশ্যই এটি স্পষ্টভাবে করতে হবে। ব্যবহার

print_something "$1"

প্রথম যুক্তি পাস, বা

print_something "$@"

তাদের সমস্ত পাস করার জন্য, যদিও উদাহরণস্বরূপ ফাংশনটি কেবল প্রথমটি ব্যবহার করে।


1
এটি বর্তমানে যেমন লেখা রয়েছে তেমন পাস "$@"করার print_somethingপরেও কেবল যুক্তিগুলির প্রথম প্রিন্ট হবে।
কুসালানন্দ

13
তবে বিন্দুটি ছিল কীভাবে সমস্ত আর্গুমেন্টগুলি পাস করতে হবে তা আমি অনুমান করি। ফাংশনটি যেমন এটি দাঁড়িয়েছে কেবল তার প্রথম যুক্তি ব্যবহার করে তা কিছুটা অপ্রাসঙ্গিক।
অ্যারডান

ঠিক আছে, কেবল ভেবে দেখার সাথে যদি কেবল প্রথমটি ব্যবহৃত হয় তবে সমস্ত তর্ক যুক্ত করার কোনও অর্থ নেই।
কুসালানন্দ

14
@ অ্যালো নং "$*"একটি একক স্ট্রিং (প্রথম চরিত্রে যোগ হবে $IFS) হবে যখন "$@"পৃথকভাবে উদ্ধৃত উপাদানগুলির একটি তালিকা হবে।
কুসালানন্দ

5
@ কুসালানন্দকে যে কেউ কমান্ড-লাইন প্যারামিটারগুলি কোনও ফাংশনে ব্যবহার করতে চায় তা বলার বিন্দু "$@", এমনকি যদি এই ক্ষেত্রে কেবল এই জাতীয় প্যারামিটার থাকে তবে এই জাতীয় সমস্ত ঘটনা কভার করা উচিত । যদি ওপি দ্বিতীয় প্যারামিটার যুক্ত করার সিদ্ধান্ত নেয় তবে ফাংশন অনুরোধে কোনও পরিবর্তন করার নেই। এবং অন্য যে কেউ এটি পড়েন তারা পরে এটি পুনরায় না করতে এড়াতে সঠিকভাবে তা শিখবে।
মন্টি হার্ডারের

10

এটি কারণ একটি অভিহিত ফাংশন পিতামাতার / কলারের সেট থেকে পৃথক, অবস্থানগত পরামিতিগুলির নিজস্ব সেট পায়। চেষ্টা

print_something "$1"

(এবং echo "$1", বা আরও ভাল printf '%s\n' "$1", প্যারামিটার বিস্তৃতি উদ্ধৃত করতে মনে রাখবেন এবং এটি echoস্বেচ্ছাসেবী ডেটার জন্য ব্যবহার করা যাবে না)।


আপনি কী বলছেন সে সম্পর্কে আপনাকে আরও পরিষ্কার হওয়া দরকার। কলার $1সাধারণত ফাংশনটির থেকে পৃথক $1, যদিও তারা উপরে প্রস্তাবিত মত ব্যবহার করা হয় একই হতে পারে। যদি আমি আপনি সঠিক পেতে echoএকই (থাকতে পারেন echo $1) যখন ফাংশন একক পরামিতি সঙ্গে বলা হয় ( print_something $2নেয় আহ্বানকারী এর $ 1 এবং "তোলে" এটা $1ফাংশন অভ্যন্তরীণ)
RudiC

6
আপনি প্রসারিত করতে ফাইলের ধরণগুলির আইএফএস-সীমিত তালিকা হিসাবে বিবেচনা echo $1না করতে চাইলে ব্যবহার করা কোনও অর্থবোধ করে না $1echo "$1"আরো ইন্দ্রিয় যদিও আউটপুট would বিষয়বস্তুর করা, $1এর মানের জন্য $1মত -nene, -EE...
Stéphane Chazelas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.