শেল স্ক্রিপ্টিং-এ কমান্ডের কী কী সুবিধা রয়েছে তা প্রদত্ত যে এটি স্পষ্টভাবে কিছুই করে না?


27

শেল স্ক্রিপ্টিং-এ মন্তব্য সম্পর্কে এই প্রশ্নের উত্তরে , এটি ইঙ্গিত করা হয় যে এটি :একটি নাল কমান্ড যা স্পষ্টভাবে কিছুই করে না (তবে মন্তব্যের জন্য ব্যবহার করা হবে না)।

কোন কমান্ডের ইউটিলিটি কী হবে যা পুরোপুরি কিছুই করে না?



2
আরও দেখুন এই প্রশ্নের যা আরও ভাল উত্তর আছে এখানে , যথা যে :হতে প্রয়োজন বোধ করা হয় একটি বিল্ট-ইন, যখন trueযা ভেরিয়েবল এর সুযোগ প্রভাবিত করে, নয়
প্রাচীন প্রো

2
এটি সুস্পষ্টভাবে কিছুই করায় না
মাইকজার্ভ

উত্তর:


19

আমি সাধারণত trueলুপগুলিতে ব্যবহার করি ; আমি মনে করি এটি আরও স্পষ্ট:

while true; do
    ...
done

যে জায়গাটি আমি খুঁজে পেয়েছি :তা সত্যই কার্যকর যে যদি বিবৃত হয় তবে আপনার যদি কিছু মেলে প্রয়োজন হয় তবে আসলে কিছু করতে চান না। উদাহরণ স্বরূপ:

case $answer in
    ([Yy]*) : ok ;;
    (*)     echo "stop."; exit 1 ;;
esac

3
আমি রাজী. trueশর্তের :জন্য, একটি এনওপি-র জন্য।
jw013

1
বাশ গ্রহণ করে case a in a ) ;; esac। কিছু শাঁস আছে যা এটি গ্রহণ করে না?
কাজ

@Kaz: মতে POSIX শেল ব্যাকরণ , case ${var} in value);; *) do_something;; esacগ্রহণযোগ্য। :কমান্ড খালি ক্ষেত্রে প্রয়োজন হয় না।
রিচার্ড হ্যানসেন

12

মূলত, এটি নির্ধারণ করতে ব্যবহৃত হয়েছিল যে এটি বোর্ন শেল প্রোগ্রাম ছিল, সি সংকলিত প্রোগ্রামের বিপরীতে। এটি শেবাং এবং একাধিক স্ক্রিপ্টিং ভাষাগুলির (সিএসএস, পার্ল) আগে ছিল। আপনি এখনও ঠিক দিয়ে শুরু করে একটি স্ক্রিপ্ট চালাতে পারেন ::

$ echo : > /tmp/xyzzy
$ chmod +x /tmp/xyzzy
$ ./xyzzy

এটি সাধারণত $SHELL(বা /bin/sh) এর বিপরীতে স্ক্রিপ্টটি চালাবে ।

সেই থেকে মূল যুক্তিটি আর্গুমেন্টগুলি মূল্যায়ন করা। আমি এখনও ব্যবহার:

: ${EDITOR:=vim}

স্ক্রিপ্টে একটি ডিফল্ট মান সেট করতে।


11

: লুপগুলি লেখার জন্য দরকারী যা অবশ্যই এর মধ্যে থেকে শেষ করা উচিত।

while :
do
    ...stuff...
done

এটি চিরতরে চলবে breakবা না exitবলা হয় বা শেলটি একটি সমাপ্তি সংকেত না পেয়ে থাকে।


3
আমি অনুভব করি যে while true; do ...; doneপাঠকের কাছে উদ্দেশ্যগুলি আরও ভালভাবে যোগাযোগ করেwhile :; do ...; done
রিচার্ড হ্যানসেন :

9

যখন আপনি শেল স্ক্রিপ্টিংয়ে "না" বিবৃতি চান, আপনি হয় "না" শর্তটি ব্যবহার করেন, যা কিছু পরীক্ষার জন্য বোকামি দেখাতে পারে, বা আপনি সত্য: অনুচ্ছেদে ':' ব্যবহার করে, মিথ্যা-তে সত্য কোড সহ দফা।

if [ some-exotic-condition ]
then
    :
else
    # Real code here
fi

"বহিরাগত অবস্থা" এমন কিছু হতে পারে যা আপনি অস্বীকার করতে চান না বা আপনি যদি "নেতিবাচক যুক্তি" ব্যবহার না করেন তবে এটি কেবল অনেক পরিষ্কার।


1
এটি উত্পাদিত স্ক্রিপ্টগুলিতেও দেখায় autoconfকারণ :শর্তটি কীভাবে বিপরীত করা যায় তা নির্ধারণের চেয়ে খালি শাখাগুলির জন্য একটি ডিফল্ট যুক্ত করা আরও সহজ ।
ডায়েটারিচ এপ্পি

2
আমি দেখতে পাচ্ছি না যে !সামনে কোনও [ some-exotic-condition ]লাঠি কী বোকা, কিন্তু বোকামি না : elseহওয়ার পরে একটি অতিরিক্ত অতিরিক্ত ।
কাজ

@ কাজ এর একটি ভাল পয়েন্ট রয়েছে। আসুন মনে রাখবেন যে বহিরাগত অবস্থার সাথে আসা সবচেয়ে ভাল কঠিন। আপনার যদি এগুলির সমস্তটি অবহেলা করতে হয় তবে এটি একটি জিনিস তবে এটি শর্তটিকে আরও পরিষ্কার করে দিতে পারে। একটি '!' পুরো শর্ত অবহেলা, না শুধুমাত্র প্রথম পদ? কখনও কখনও কখনও ':' এর সত্য ধারা থাকা ভাল।
ব্রুস এডিগার

!টোকেন একটি সম্পূর্ণ কমান্ড পাইপ উপাদান negates। while ! grep ... ; do ... done বা if ! [ ... ] ; then ... fi। এটি মূলত test/[]বাক্য গঠনের বাহ্যিক । দেখুন: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
কাজ

5

সাময়িকভাবে কোনও রেখাটি মন্তব্য করার জন্য # অক্ষর ছাড়াও আমি এটি কখনও ব্যবহার করেছি, এমন পরিস্থিতিতে যেখানে লাইনটি মন্তব্য করা একটি বাক্য গঠন ত্রুটি সৃষ্টি করে, শেল ব্যাকরণে ত্রুটির কারণে কমান্ডের খালি অনুক্রমের অনুমতি না দেয় :

if condition ; then
    :# temporarily commented out command
fi

ছাড়াই: আমাদের একটি অনুপস্থিত কমান্ড সিকোয়েন্স রয়েছে যা একটি সিনট্যাক্স ত্রুটি।


4

দুটি ক্ষেত্রেই আমি :দরকারী বলে মনে করি:

ডিফল্ট ভেরিয়েবল অ্যাসাইনমেন্ট

#!/bin/sh

# set VAR to "default value" if not already set in the environment
: "${VAR=default value}"

# print the value of the VAR variable.  Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR}"

আপনার শেল স্ক্রিপ্টের ব্যবহারকারীদের স্ক্রিপ্টটি সম্পাদনা না করে কোনও সেটিংস ওভাররাইড করার অনুমতি দেওয়ার এটি একটি সুবিধাজনক উপায়। (তবে, কমান্ড-লাইন আর্গুমেন্টগুলি ভাল কারণ আপনি যদি অপ্রত্যাশিত আচরণের ঝুঁকিটি চালান না তবে যদি ব্যবহারকারী কাকতালীয়ভাবে তাদের রফতান পরিবেশে আপনার ব্যবহারযোগ্য পরিবর্তনশীল থাকে।) ব্যবহারকারী কীভাবে সেটিংসটিকে ওভাররাইড করবে:

VAR="other value" ./script

${VAR=value}সিনট্যাক্স সেট বলল VARকরতে valueযদি VARইতিমধ্যে সেট না করা হয়, তাহলে ভেরিয়েবলের মান প্রসারিত। যেহেতু আমরা এখনও ভেরিয়েবলের মান সম্পর্কে চিন্তা করি না, তাই এটি :ফেলে দেওয়ার জন্য কোনও অপ-কমান্ডের আর্গুমেন্ট হিসাবে এটি পাস করা হয়।

যদিও :কোনও অপ-কমান্ড হলেও , :কমান্ড চালানোর আগে শেল ( কমান্ড নয়!) দ্বারা সম্প্রসারণ করা হয় :যাতে ভেরিয়েবল অ্যাসাইনমেন্টটি এখনও ঘটে (যদি প্রযোজ্য হয়)।

এটির trueপরিবর্তে বা অন্য কোনও কমান্ড ব্যবহার করাও গ্রহণযোগ্য হবে :তবে উদ্দেশ্যটি কম পরিষ্কার হওয়ার কারণে কোডটি পড়া আরও শক্ত হয়ে যায়।

নিম্নলিখিত লিপিটিও কাজ করবে:

#!/bin/sh

# print the value of the VAR variable.  Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR=default value}"

তবে উপরোক্ত রক্ষণাবেক্ষণ করা বেশ কঠিন। যদি এই লাইনটির ${VAR}উপরে কোনও লাইন যুক্ত করা হয় printf, তবে ডিফল্ট অ্যাসাইনমেন্ট সম্প্রসারণ সরিয়ে নিতে হবে। বিকাশকারী যদি সেই কাজটি সরিয়ে নিতে ভুলে যায় তবে একটি বাগ প্রবর্তিত হবে।

খালি শর্তাধীন ব্লকে কিছু রাখার জন্য

খালি শর্তসাপূর্ণ ব্লকগুলি এড়ানো উচিত, তবে সেগুলি কখনও কখনও দরকারী হয়:

if some_condition; then
    # todo:  implement this block of code; for now do nothing.
    # the colon below is a no-op to prevent syntax errors
    :
fi

কিছু লোক যুক্তি দেখান যে একটি খালি সত্যিকারের ifব্লক থাকার ফলে পরীক্ষার বিষয়টি উপেক্ষা করার চেয়ে কোড পড়া সহজ করা যায়। উদাহরণ স্বরূপ:

if [ -f foo ] && bar || baz; then
    :
else
    do_something_here
fi

এর চেয়ে পড়ার পক্ষে তর্কযোগ্যভাবে সহজ:

if ! [ -f foo ] || ! bar && ! baz; then
    do_something_here
fi

তবে আমি বিশ্বাস করি যে কয়েকটি বিকল্প উপায় আছে যা খালি সত্যিকারের ব্লকের চেয়ে ভাল:

  1. শর্তটি একটি ফাংশনে রাখুন:

    exotic_condition() { [ -f foo ] && bar || baz; }
    
    if ! exotic_condition; then
        do_something_here
    fi
  2. শর্তটি কোঁকড়া ধনুর্বন্ধনী (বা বন্ধনীর ভিতরে রাখুন, তবে বন্ধনীগুলি একটি সাব-শেল প্রক্রিয়া উত্পন্ন করে এবং সাবশেলের অভ্যন্তরে পরিবেশে যে কোনও পরিবর্তন ঘটে তা সাবহেলের বাইরে দৃশ্যমান হবে না):

    if ! { [ -f foo ] && bar || baz; } then
        do_something_here
    fi
  3. এর ||পরিবর্তে ব্যবহার করুন if:

    [ -f foo ] && bar || baz || {
        do_something_here
    }

    প্রতিক্রিয়াগুলি যখন একটি সাধারণ এক-লাইনার যেমন শর্তগুলি জোর দেওয়া হয় তখন আমি এই পদ্ধতির পছন্দ করি:

    log() { printf '%s\n' "$*"; }
    error() { log "ERROR: $*" >&2; }
    fatal() { error "$@"; exit 1; }
    
    [ -f foo ] && bar || baz || fatal "condition not met"

1

ইউএনআইএক্স-এর প্রাচীন সংস্করণে পুরানো প্রাক-বোর্ন শেল-এ, :কমান্ডটি মূলত এর জন্য লেবেল নির্দিষ্ট করার জন্য তৈরি gotoকরা হয়েছিল (এটি একটি পৃথক কমান্ড ছিল যা লেবেলটি যেখানে পাওয়া যায় সেখানে ইনপুটটিকে বাতাস দেয়, সুতরাং লেবেলগুলি পৃথক বাক্য গঠন হতে পারে না যা শেলও জানে। ifএটি একটি পৃথক কমান্ডও ছিল)) খুব শীঘ্রই এটি একটি মন্তব্যে সিনট্যাক্স ( #ব্যাকস্পেসের জন্য ব্যবহৃত হয়েছিল) হওয়ার আগেই মন্তব্যগুলির জন্য ব্যবহৃত হয়েছিল এবং এই দিনগুলি যতটা সামঞ্জস্যতার জন্য রয়েছে।


0

এটিকে কিছুই না করে এমন বিবৃতি হিসাবে ব্যবহার করার পাশাপাশি, আপনি এটির পক্ষে যুক্তি হিসাবে পরিণত করে একক বিবৃতিতে মন্তব্য করতে ব্যবহার করতে পারেন:।


এটি হ'ল কোনও মন্তব্য হবে না কারণ : echo write this line > myfileএখনও খালি ফাইল তৈরি করবে।
আর্গেজ

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