"ফু" বারে "" অংশ ছাড়াই "জন্য" ল্যাশ দিন Bash


25

আমি সম্প্রতি এমন কিছু কোড দেখছিলাম যা আমাকে বিভ্রান্ত করেছিল কারণ এটি কাজ করে এবং আমি এটির আশা করি না। কোড এই উদাহরণ হ্রাস

#!/bin/bash
for var;
do
  echo "$var"
done

কমান্ড লাইন আর্গুমেন্ট দিয়ে চালানো হলে সেগুলি মুদ্রণ করা হয়

$ ./test a b c
a
b
c

এটি এটাই (আমার কাছে) অপ্রত্যাশিত। varসংজ্ঞায়িত হওয়ার কারণে কেন এটি একটি ত্রুটির কারণ হয় না? এটি কি 'ভাল অনুশীলন' হিসাবে বিবেচিত?

উত্তর:


27

forin value1 value2...সমস্ত বোর্নের মতো শেলগুলিতে কোনও অংশ নির্দিষ্ট না করা থাকলে অবস্থানগত পরামিতিগুলিতে লুপগুলি লুপ করে ।

70 এর দশকের শেষের দিকে বোর্ন শেলের ক্ষেত্রে এটি ইতিমধ্যে ছিল, যদিও বোর্ন শেল-এ, আপনাকে এটি বাদ দিতে হবে ;(আপনি for i doকিছু পুরাতন ছাই সংস্করণ বাদে যেখানে আপনার নতুন লাইনের প্রয়োজন আছে সেখানে do) ব্যবহার করতে পারেন )।

দেখুন loops জন্য ব্যাশ মধ্যে "do" শব্দ উদ্দেশ্য কী? আরও বিস্ময়কর রূপগুলি সহ আরও তথ্যের জন্য ।

এরকম:

for i
do
  something with "$i"
done

ভাল অনুশীলন হয়। এটি সাধারণত সমমানের তুলনায় কিছুটা বেশি বহনযোগ্য / নির্ভরযোগ্য:

for i in "$@"; do
  something with "$i"
done

যার জন্য বোর্ন শেল, ksh88 এর কিছু শর্তে কিছু সমস্যা রয়েছে (যেমন $#বোর্ন শেলটির কিছু সংস্করণে কখন 0 হয় (যা ${1+"$@"}পরিবর্তে "$@"প্রায় কাজ $IFSকরতে পারে ) বা বোর্নে এবং ksh88 তে স্থানের অক্ষর থাকে না) বা কখন nounsetবিকল্পটি সক্ষম করা হয়েছে $#0 সহ কিছু শাঁস কিছু সংস্করণ রয়েছে bash( আবার সঙ্গে ${1+"$@"}হিসাবে একটি কাজ প্রায় )।


আমার মস্তিষ্ক শুরুতে পুনরায় 'লুপ' সম্পাদনা বন্ধ করার সিদ্ধান্ত নেওয়ার আগে এই তিনবার পড়তে হয়েছিল
থ্রি ডায়াগ

20

হ্যাঁ, এটি ডিফল্ট আচরণ। এটা নথিভুক্ত করা helpএর forমূল শব্দ:

terdon@tpad ~ $ help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
    Execute commands for each member in a list.

    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.

    Exit Status:
    Returns the status of the last command executed.

সুতরাং, যখন আপনি এটি পুনরুক্তি করতে একটি তালিকা ধরে দিতে হবে না, এটা উপর iterating ডিফল্ট করবে $@, অবস্থানগত পরামিতি অ্যারে ( a, bএবং cআপনার উদাহরণে)।

এবং এই আচরণটি পসিক্স দ্বারা সংজ্ঞায়িত করা হয়েছে তাই হ্যাঁ, এটি যতদূর যায় "ভাল অনুশীলন" হিসাবে বিবেচিত হয়।

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