$# আর্গুমেন্টের সংখ্যা, তবে মনে রাখবেন এটি কোনও ফাংশনে আলাদা হবে।
$#স্ক্রিপ্ট, শেল বা শেল ফাংশনে পাস হওয়া অবস্থানগত পরামিতিগুলির সংখ্যা । এটি কারণ, শেল ফাংশন চলাকালীন অবস্থানগত পরামিতিগুলি অস্থায়ীভাবে ফাংশনে যুক্তির সাথে প্রতিস্থাপন করা হয় । এটি ফাংশনগুলিকে তাদের নিজস্ব অবস্থানগত পরামিতিগুলি গ্রহণ এবং ব্যবহার করতে দেয়।
এই স্ক্রিপ্টটি সর্বদা মুদ্রণ করে 3, স্ক্রিপ্টে নিজেই কতগুলি আর্গুমেন্ট পাস হয়েছিল তা নির্বিশেষে, কারণ "$#"ফাংশনে ফাংশনে fপ্রেরিত আর্গুমেন্টের সংখ্যাটি প্রসারিত হয়:
#!/bin/sh
f() {
echo "$#"
}
f a b c
এটি গুরুত্বপূর্ণ কারণ এটির মতো কোডটি আপনার প্রত্যাশা মতো কাজ করে না, আপনি যদি শেল ফাংশনগুলিতে অবস্থানগত পরামিতিগুলি কীভাবে কাজ করেন তার সাথে পরিচিত না হন:
#!/bin/sh
check_args() { # doesn't work!
if [ "$#" -ne 2 ]; then
printf '%s: error: need 2 arguments, got %d\n' "$0" "$#" >&2
exit 1
fi
}
# Maybe check some other things...
check_args
# Do other stuff...
ইন check_args, $#ফাংশন নিজেই পাস আর্গুমেন্ট সংখ্যা প্রসারিত, যা স্ক্রিপ্ট সর্বদা 0 হয়।
আপনি যদি শেল ফাংশনে এই জাতীয় কার্যকারিতা চান তবে আপনার পরিবর্তে এই জাতীয় কিছু লিখতে হবে:
#!/bin/sh
check_args() { # works -- the caller must pass the number of arguments received
if [ "$1" -ne 2 ]; then
printf '%s: error: need 2 arguments, got %d\n' "$0" "$1" >&2
exit 1
fi
}
# Maybe check some other things...
check_args "$#"
এটি কাজ করে কারণ ফাংশনের বাইরে$# প্রসারিত এবং এর অবস্থানগত পরামিতিগুলির একটি হিসাবে ফাংশনে চলে গেছে । ফাংশনের অভ্যন্তরে, প্রথম অবস্থানগত প্যারামিটারটি প্রসারিত হয় যা শেল ফাংশনে স্থান দেওয়া হয়েছিল, এর স্ক্রিপ্টের চেয়ে এটির অংশ নয়।$1
সুতরাং, মত $#, বিশেষ পরামিতি $1, $2ইত্যাদি, সেইসাথে $@এবং $*, এছাড়াও আর্গুমেন্ট একটি ফাংশন প্রেরণ করা, যখন তারা ফাংশনে প্রসারিত হয় অধিকারে থাকা। যাইহোক, ফাংশনটির নামে পরিবর্তন $0হয় না , এ কারণেই আমি এখনও এটি একটি মানের ত্রুটি বার্তা তৈরি করতে সক্ষম হয়েছি।
$ ./check-args-demo a b c
./check-args-demo: error: need 2 arguments, got 3
একইভাবে, আপনি যদি অন্যটির ভিতরে একটি ফাংশন সংজ্ঞায়িত করেন তবে আপনি অবস্থানগত পরামিতিগুলির সাথে কাজ করছেন যা অভ্যন্তরীণতম ফাংশনটিতে প্রসারিত হয়:
#!/bin/sh
outer() {
inner() {
printf 'inner() got %d arguments\n' "$#"
}
printf 'outer() got %d arguments\n' "$#"
inner x y z
}
printf 'script got %d arguments\n' "$#"
outer p q
আমি এই স্ক্রিপ্টটি কল করেছি nestedএবং (চলার পরে chmod +x nested) আমি এটি চালিয়েছি:
$ ./nested a
script got 1 arguments
outer() got 2 arguments
inner() got 3 arguments
হ্যা আমি জানি. "1 টি আর্গুমেন্ট" একটি বহুবচন বাগ।
অবস্থানগত পরামিতিগুলিও পরিবর্তন করা যেতে পারে।
আপনি যদি কোনও স্ক্রিপ্ট লিখছেন, কোনও ফাংশনের বাইরের অবস্থানগত পরামিতিগুলি যদি আপনি না পরিবর্তন করেন তবে স্ক্রিপ্টে কমান্ড-লাইন আর্গুমেন্ট হবে ।
এগুলি পরিবর্তন করার একটি সাধারণ উপায় হ'ল shiftবিল্টিনের সাথে, যা প্রতিটি অবস্থানগত পরামিতিকে এক-এক করে বামে স্থানান্তরিত করে, প্রথমটি নামিয়ে $#1: হ্রাস করে:
#!/bin/sh
while [ "$#" -ne 0 ]; do
printf '%d argument(s) remaining.\nGot "%s".\n\n' "$#" "$1"
shift
done
$ ./do-shift foo bar baz # I named the script do-shift.
3 argument(s) remaining.
Got "foo".
2 argument(s) remaining.
Got "bar".
1 argument(s) remaining.
Got "baz".
সেগুলি setবিল্টিনের সাহায্যেও পরিবর্তন করা যেতে পারে :
#!/bin/sh
printf '%d args: %s\n' "$#" "$*"
set foo bar baz
printf '%d args: %s\n' "$#" "$*"
$ ./set-args a b c d e # I named the script set-args.
5 args: a b c d e
3 args: foo bar baz
$#? তুমি কি অর্জন করতে চাও? আপনি এই আদেশ কোথায় পেলেন? এটি মোটেই প্রাসঙ্গিক নয়।