বাশ নুল-অপারেটর ":", কোলনটির বিন্দুটি কী?


13

একটি বেস স্ক্রিপ্টে "নাল" অপারেটরের বিন্দুটি কী? আমি বুঝতে পারি যে ifকমান্ড অনুসরণ করে এটি একটি স্থানধারক হিসাবে ব্যবহৃত হয় যখন আপনার কিছু বলার অপেক্ষা রাখে না, তবে প্রোগ্রামটি সঠিকভাবে চলতে দেওয়ার জন্য একটি আদেশের প্রয়োজন need তবে এর সামগ্রিক ব্যবহার কী? যখন আপনি এটি ব্যবহার করতে হবে? কখন এটি ব্যবহার করা বোধগম্য?



1
আপনি যে কারণে উদ্ধৃত করেছেন তা বেশ গুরুত্বপূর্ণ। আপনার আরও দরকার কেন?
টেরডন

উত্তর:


16

প্যারামিটার সম্প্রসারণের পার্শ্ব-প্রতিক্রিয়াগুলি হতে দেয় এটি কখনও কখনও দরকারী।

উদাহরণস্বরূপ, একটি ডিফল্ট মান সেট করা

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"

2
দ্বিতীয় লাইনটি কীভাবে কাজ করে আপনি প্রতীক দ্বারা প্রতীকটি ব্যাখ্যা করতে পারেন?
Ruslan

বাশ ম্যানুয়ালটিতে :কমান্ড এবং প্যারামিটার সম্প্রসারণ সম্পর্কে পড়ুন ।
গ্লেন জ্যাকম্যান

4
@Glennjackman রেফারেন্স দিচ্ছে তা রূপরেখার জন্য, দ্বিতীয় লাইনটি নাল কমান্ডটি কল করে:, এবং ${name:="John Doe"}প্রসারিত হবে, যার ফলে অ্যাসাইনমেন্টটি ঘটবে কারণ এটি যুক্তি হিসাবে পড়া হয়:। এটি ছাড়াই: শেলটি "জন দো" একটি কমান্ড হিসাবে চালানোর চেষ্টা করবে, বা মানটি $nameএটি ইতিমধ্যে সেট করা থাকলে
সপ্তাহান্তিক

13

আপনি এটি অন্তহীন লুপগুলির জন্যও ব্যবহার করতে পারেন:

while : ; do 
   # ....
done

4
তবে সম্ভবত while trueএটি আরও পাঠযোগ্য, কারণ (ক) এটি কম বিরামচিহ্ন ব্যবহার করে এবং (খ) এটি সি-প্রাপ্ত ভাষার সাথে আরও মিল রয়েছে।
wchargin

9

আপনি কোনও প্রোগ্রাম চালনা ছাড়াই ফাইল তৈরি করতে এটি ব্যবহার করতে পারেন ::

: > /path/to/file

এটি তুলনামূলকভাবে দ্রুততর touch /path/to/file (যেহেতু এটি touchপ্রোগ্রাম চালানোর প্রয়োজন হয় না ) এবং কেবল সরল চেয়ে সামান্যতর বহনযোগ্য হতে পারে

> /path/to/file

যা অনেক সিস্টেমে কাজ করে বলে মনে হচ্ছে। একইভাবে, কোনও ফাইলে আপনার লেখার অ্যাক্সেস রয়েছে কিনা তা যাচাই করতে এটি ব্যবহার করা যেতে পারে :

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi

যদিও এটি, এছাড়াও, সাধারণত ছাড়া করা সম্ভব :। আদেশ সহকারে:

  • ফাইলটি ইতিমধ্যে বিদ্যমান কিনা তা এটি পরীক্ষা করে না। যদি এটি না হয় তবে এটির অনুমতি দেওয়ার সাথে সাথে এটি ফাইলটি তৈরি করবে।
  • যদি ফাইলটি বিদ্যমান না থাকে এবং আপনার স্ক্রিপ্টে এটি তৈরি করার অনুমতি না পেয়ে থাকে, তবে এটি "লেখার অনুমতি প্রত্যাখ্যান করা" প্রতিবেদন করবে।

(এটির চেয়ে বেশি নির্ভরযোগ্য কারণগুলির জন্য লিঙ্কযুক্ত প্রশ্নটি দেখুন See if [ -w /path/to/file ])


5

ওয়ে ফিরতি, ইউনিক্স ভি 6 এবং থম্পসন শেল-এ, বিবৃতিটির :অংশ হিসাবে প্রকৃতপক্ষে ব্যবহৃত হয়েছিল gotoম্যানুয়াল অনুসারে , এটি মূলত ইউনিক্সের 3 সংস্করণে উপস্থিত হয়েছিল:

পুরো কমান্ড ফাইলটি একটি দিয়ে শুরু হওয়া একটি লাইনের জন্য অনুসন্ধান করা হয়: প্রথম অ-ফাঁকা অক্ষর হিসাবে, তারপরে এক বা একাধিক ফাঁকা স্থান এবং তারপরে লেবেল। যদি এই জাতীয় কোনও লাইন পাওয়া যায়, তবে লোনটি লেবেলের অফসেট কমান্ড-ফাইলটি স্থাপন করে প্রস্থান করার পরে। এটি শেলটি লেবেলযুক্ত লাইনে স্থানান্তরিত করে।

আজকাল, ইন bash, এটি কোনও অপ-অপারেটর হিসাবে ব্যবহৃত হয়েছে, সাফল্যে ফিরে আসবে। প্রকৃতপক্ষে, আপনি যদি সোর্স কোডটি দেখুন , আপনি নীচে নীচে একই ফাংশন trueএবং উভয়ই দেখতে পাবেন । কোনও অন্তর্নির্মিত কমান্ড নেই, এবং এটি এটি যা করার জন্য এটি একটি মোটামুটি বড় কমান্ড:int colon_builtin():/bin/true

:যে কোনও জায়গায় ব্যবহৃত হতে পারে true, উদাহরণস্বরূপ command_that_can_fail || true, যদিও এটি অ-বিশেষজ্ঞদের বিভ্রান্ত করার সম্ভাবনা রয়েছে। এটি সম্পর্কে এখানে আরও পড়ুন ।


3

আপনি ifকেবলমাত্র নেতিবাচক দিক থেকে কিছু করতে চাইলে আপনি কোনও আদেশের ইতিবাচক পরীক্ষায় এটি ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

if [[ True == False ]]; then
    :
else
    echo "true <> flase"
fi

:ব্যাশ ছাড়াই একটি সিনট্যাক্স ত্রুটি তৈরি হবে।

এটি একটি ওভারস্প্লিম্লাইফাইড উদাহরণ। আপনি প্রাথমিক কোডিংয়ে সাধারণত এমন কৌশল ব্যবহার করবেন যখন আপনি এখনও কোড সেগমেন্টটি লিখেছেন না এবং এমন কিছু দরকার যা ত্রুটি তৈরি করে না।


উত্তম উত্তর, যদিও এটি প্রথমে স্পষ্ট নাও হতে পারে, যা পরীক্ষার শর্তের মধ্যে একটি প্রকৃত কমান্ডের সাথে এটি সবচেয়ে কার্যকর, উদাহরণস্বরূপ if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fiকেবল ফায়ারফক্স চালু না থাকলে ত্রুটি দেখাবে। অন্য কথায়, যখন আপনার কিছু করার প্রয়োজন কেবল তখনই যখন কমান্ডের একটি ত্রুটি থাকে। এক উপায়ে এটি সমান pgrep firefox || echo "Firefox not running", যদিও আরও পাঠযোগ্য এবং আরও কমান্ডের অনুমতি দেয়
সের্গি কলডিয়াজহনি

0

স্ক্রিপ্টটি ভুল হতে না দেওয়ার জন্য আমি কেবল এটি এসএসএইচ কমান্ড সহ একটি স্ক্রিপ্টে ব্যবহার করেছি।

এই ক্ষেত্রে, আমি দেখতে চাই যে কোনও ব্যবহারকারী কোনও সেট সার্ভারের সাথে সংযোগ করতে পারে কিনা। সংযোগটি ঠিক থাকলে, দূরবর্তী হোস্টটি ঠিক আছে প্রতিধ্বনিত হবে। যদি সংযোগ ব্যর্থ হয় তবে এসএসএইচ ত্রুটির সাথে প্রতিক্রিয়া জানাবে। যাইহোক, আমি চাই আমার স্ক্রিপ্টটি 0 দিয়ে প্রস্থান করা উচিত এবং এসএসএইচ কমান্ডের ব্যর্থ হলে এর মান নয়। সুতরাং মূলত আমি ||নাল কমান্ড দিয়ে ওআরএস করে এসএসএইচ ত্রুটিটি ফাঁদে ফেলেছি :। এটা এমন দেখতে:

#!/bin/bash
for i in $(cat servers.txt); do
    echo -n "$i "; 
    ssh user@${i} 'echo OK' || :; 
done

এইভাবে আমি এসএসএইচ থেকে আউটপুট পাই তবে ত্রুটি কোডটি নয়:

....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.