"$ {PS1-}" বৈধ বাক্য গঠন এবং কীভাবে এটি সরল "$ PS1" থেকে আলাদা?


12

আমি একটি স্ক্রিপ্ট খুঁজছি যা আছে:

if [ "${PS1-}" ]; then

এই -পেছনটি আমাকে কিছুটা বাগ দেয় কারণ এটি প্যাসিক্স বা বাশ স্ট্যান্ডার্ড সিনট্যাক্সের মতো মনে হয় না। এটি এমন কিছু আরকেন সিনট্যাক্স যা প্রায় চিরকালই ছিল, না এটি টাইপো? স্ট্যান্ডার্ড / ডক্সের কোনও রেফারেন্স প্রশংসা করা হবে।

সাধারণত আমি এটি কোড করব:

if [ "$PS1" ]; then

কোনটি আরও সঠিক বা তাদের মধ্যে কোনও পার্থক্য রয়েছে?

উত্তর:


12

এটি অবশ্যই পসিক্স সিনট্যাক্স । paraphrasing:

ব্যবহার করে ${parameter-word}, যদি parameterহয়

  • সেট করুন এবং নাল নয়, তারপরে মানটির বিকল্প করুন parameter,
  • সেট কিন্তু নাল, তারপর নাল বিকল্প, এবং
  • আনসেট করুন, তারপরে বিকল্প দিন word

উদাহরণ সেশন:

$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"

$ parameter=value
$ echo "${parameter-word}"
value

এখানে "নাল" এর অর্থ খালি স্ট্রিং। উদাহরণস্বরূপ, এসকিউএল এর বিপরীতে, পসিক্স শেলগুলিতে কোনও বিশেষ নাল মান নেই।

এটি "প্যারামিটার সম্প্রসারণ" বিভাগেও নথিভুক্ত করা হয়েছে man bash


1
আমার অনুমান যে ব্যাশ এবং ড্যাশ ম্যান-পৃষ্ঠাগুলি অসম্পূর্ণ, কারণ তারা এই বাক্য গঠনটি (বিজোড়) উল্লেখ করে না!
গ্রেগোর

1
@ গ্রেগর উভয় ম্যানুয়ালই এটি উল্লেখ করেছে। বাশ ম্যানুয়ালে এটি প্যারামিটার বিস্তারের তালিকার আগে অনুচ্ছেদে রয়েছে এবং ড্যাশ ম্যানুয়ালে এটি পরের অনুচ্ছেদে রয়েছে।
কুসালানন্দ

1
ঠিক আছে, "কোলন ছেড়ে যাওয়া হচ্ছে ...." আমি চাই না য়ে :( দেখতে পাইনি
গ্রেগর

zshআমার জানা একমাত্র শেলটি হ'ল কোলন-মুক্ত রূপগুলি স্পষ্টভাবে উল্লেখ করেছে, কোলন বাদ দিয়ে কী করে তা কেবল একটি নোট তৈরির চেয়ে।
চিপনার

1
@ পিটিএস, পসিক্সের পাঠ্যটিতে খুব বেশি এক্সক্লুসিভভাবে "নাল" শব্দটি ব্যবহার করা হয়েছে, যা ম্যান পৃষ্ঠাগুলিতে এর ব্যবহার ব্যাখ্যা করতে পারে।
ইলকচাচু

23

পরিবর্তনশীল প্রসারণটি সেট করা থাকলে এবং নন-নাল (খালি স্ট্রিং নয়) এর ${parameter:-word}মান ব্যবহার করবে $parameter, অন্যথায় এটি স্ট্রিংটি ব্যবহার করবে word

:মানটি খালি থাকলে তা ছাড়াই পরীক্ষার হবে না, কেবল এটি আনসেট করা আছে কি না।

এর অর্থ এটি সেট করা থাকলে এর ${PS1-}মানতে প্রসারিত হবে $PS1তবে এটি খালি বা আনসেট না থাকলে একটি ফাঁকা স্ট্রিংয়ে যাবে। এই ক্ষেত্রে, এই হল ঠিক একই হিসাবে ${PS1:-}স্ট্রিং পর -এছাড়াও খালি।

@ রকেশ শর্মা নোট হিসাবে "${PS1-}"এবং এর মধ্যে পার্থক্যটি "$PS1"সূক্ষ্ম: উভয়ই $PS1যদি সেট না করে থাকে তবে এটির মান বা খালি স্ট্রিংয়ে প্রসারিত হবে । ব্যতিক্রমটি যখন set -uসক্রিয় থাকে, সেই ক্ষেত্রে আনসেট ভেরিয়েবলগুলি প্রসারণ করা ত্রুটির কারণ হতে পারে । (খালি) ডিফল্ট মান সেট করে এটি ত্রুটি ছাড়াই খালি স্ট্রিংটিতে "${PS1-}"একটি সেট না PS1করে প্রসারিত করে ।

এটি স্ট্যান্ডার্ড সিনট্যাক্স ( s০-এর দশকের শেষের দিকে বোর্ন শেল থেকে উদ্ভূত ), একইরকম আরও কয়েকটি বিস্তৃতি।


এবং যেহেতু এটি উদ্ধৃত করা হয়েছিল, এটি একইরূপে "$PS1", যেহেতু PS1খালি, এটি খালি, এবং উদ্ধৃতিগুলি শব্দটি পুরোপুরি অদৃশ্য হওয়ার হাত থেকে রক্ষা করে।
ইলকচাচু

4
যতক্ষণ set -uনা কার্যকর হয় না। যখন নামসূচক বিকল্পটি চালু থাকে, তখন "" PS1 "=> ত্রুটি দেয়। "$ {PS-}" করবে না।

@ রাকেশর্মা এটি একটি ভাল বিষয়। বিভিন্ন বাক্য গঠন প্রকৃতপক্ষে বিশেষ্য বিকল্পের উপর নির্ভর করে বিভিন্ন ফলাফল আনতে পারে, সুতরাং, পরীক্ষা ["$ {পরামিতি-}"] সম্ভবত আরও সঠিক!
গ্রেগোর

1
@ কুসালানন্দ: দয়া করে নোট করুন যে এটি যদি নন-নুল হয় তবে ${parameter:-word}এর মান ব্যবহার করবে $parameter। অন্যান্য সমস্ত ক্ষেত্রে (অর্থ: হয় সেট তবে NULL বা আনসেট না করা) এটি ব্যবহার করবে word। আপনার শব্দ:if its set or null

@ মিক্কাছু: হ্যাঁ এটা ঠিক। কেবল যখন ভেরিয়েবলগুলি set AND nonnull=> নিজে ব্যবহার করেন। অন্যদিকে, ( set but NULL OR unset) => শব্দটি ব্যবহার করুন।

6

বাক্য গঠন:

${parameter:-word}

এবং একটি বিশেষ ফর্ম:

${parameter-word}

হয় POSIX শেল বৈধ সিনট্যাক্স , ডিফল্ট মান ব্যবহার মানে wordযদি parameterসেট না বা নাল হয়।


সাধারণত, সাথে wordখালি থাকে, তারপরে:

${parameter-}

এবং:

$parameter

বা:

${parameter}

সমতুল্য

তবে এর প্রভাবের অধীনে set -uসমস্ত আনসেট ভেরিয়েবলগুলি শেলটি সমাপ্ত হতে পারে। ${parameter-}সেই কঠোর নিয়মকে বাইপাস করতে ব্যবহার করা হয়। এটি উভয় ক্ষেত্রেই কাজ করে তাই হ্যাঁ, এটি আরও সঠিক উপায়।

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