বাশ স্ক্রিপ্ট [x $ 1 = x]


21

আমি বাশ স্ক্রিপ্টটি পড়ছি আমি বুঝতে পারছি না সেখানে কী চলছে।

#!/bin/sh
[ x$1 = x ] 

দ্বিতীয় লাইনে কী চলছে এবং এর [ x$1 = x ] অর্থ কী?

উত্তর:


27

$1খালি যে চেকগুলি , যদিও এটি উদ্ধৃত করা উচিত (অনুরূপ [ -z "$1" ])। কিছু অতি পুরানো শেলগুলি খালি স্ট্রিংগুলি সঠিকভাবে পরিচালনা করে না, সুতরাং পোর্টেবল স্ক্রিপ্টগুলির লেখকগণ এই স্টাইলটি পরীক্ষা করে দেখেছিলেন। এটি কয়েক দশক ধরে প্রয়োজনীয় ছিল না, তবে লোকেরা এখনও সেভাবে করে কারণ লোকেরা এখনও সেভাবে করে।


হ্যাঁ, আপনার আর এটি করা উচিত নয় এবং আরও আধুনিক স্টাইল গ্রহণ করা উচিত। আপনি PDP11 এ কাজ না করা অবধি
ম্যাকলমন

4
এটি খালি স্ট্রিং সম্পর্কে তেমন কিছু নয়। [ x$1 = x ]এখনো ভুল হয়, কিন্তু [ "x$1" = x ]শাঁস একটি বিষয় যেখানে আছে জন্য হবে $1হয় !বা (বা -n.... [ "" = "$1" ]এবং case $1 in "")এছাড়াও ঠিক আছে যদিও হবে।
স্টাফেন চেজেলাস

2
@ ম্যাকলমন, এত পিছনে যাওয়ার দরকার নেই। [ -z "$1" ]এবং [ "$1" = "" ]এখনও সোলারিস 10 এর / বিন / শ এর সাথে কাজ করবেন না, পূর্বের ড্যাশ-0.5.4 সহ।
স্টাফেন চেজেলাস

1
শেষ বাক্যটির জন্য অতিরিক্ত +1!
গ্লেন জ্যাকম্যান

1
@glennjackman, শেষ বাক্যটি ভুল is সোলারিস 10 এখনও সোলারির সর্বাধিক বিস্তৃত সংস্করণ এবং [ "$1" = "" ]এখনও এর সাথে কাজ করে না /bin/sh(যদিও আপনি /usr/xpg4/bin/shসেখানে ব্যবহার করতে চান , না /bin/sh)। ড্যাশ জানুয়ারী 2009 সালে এই বিষয়ে স্থির করা হয়েছিল।
স্টাফেন চেজেলাস

8

স্কোয়ার ব্র্যাকেটগুলি একটি পরীক্ষা নির্দেশ করে , সুতরাং [ x$1 = x]বিনা ifবা সাদৃশ্যপূর্ণ কিছু অর্থহীন, যদিও সিন্টেক্সিকভাবে ঠিক আছে।

এটি প্রকৃত হিসাবে মূল্যায়ন করা হয় যদি x$1প্রসারিত হয় x, এবং অন্যথায় মিথ্যা হয় তবে এটি যেহেতু উদ্ধৃত হয়, যদি $1(উদাহরণস্বরূপ) "আরে এক্স" হয় তবে শেলটি দেখতে পাবেন x = x, সুতরাং এই নির্মাণটি এখনও নিরাপদ নয়।

চেকটির উদ্দেশ্যটি x = xনির্ধারণ করা হচ্ছে কোনও ভেরিয়েবলটি খালি রয়েছে কিনা determine এটি করার আরও সাধারণ উপায় হ'ল কেবল উদ্ধৃতি ব্যবহার করা:

if [ "$1" = "" ]; then

বাশ পরীক্ষার অপারেটরগুলি -zএবং -nএটি ব্যবহার করা যেতে পারে তবে তারা অন্যান্য ধরণের শেলের তুলনায় কম পোর্টেবল। 1

উক্তি বা এর কারণ x$1হ'ল বাম দিকটি কিছুতেই প্রসারিত না হয় যা সিন্ট্যাক্টিকাল ত্রুটি হতে পারে:

if [  = x ]  # No good!
if [ "" =  "" ] # Okay.
if [ x = x ] # Also okay.

1. প্রকৃতপক্ষে, testস্ট্যান্ডলোন ইউটিলিটি হতে পারে তবে বেশিরভাগ শেল এটি বিল্ট-ইন হিসাবে প্রয়োগ করে; which testএবং এর মধ্যে পার্থক্য পরীক্ষা করুন type test। জিএনইউ / লিনাক্স উপর man testবিল্ট-ইন, কিন্তু যদি আপনি কল (যেমন) দাবী উল্লেখ করতে /usr/bin/test, যে ইউটিলিটি অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে মানুষ পৃষ্ঠা থেকে নথিভুক্ত সহ বাস্তবায়ন বলে মনে হয় -zএবং -n


1
[ x$1 = x ]$1উদাহরণস্বরূপ যদি সত্য হয় তাও মূল্যায়ন করবে " -o x"। ব্যবহার করে দেখুন sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'[ x$1 = x ]ভুল এবং কোন মানে নেই।
স্টাফেন চেজেলাস

@ স্টাফেনচাজলাস ধন্যবাদ এসসি - সম্পাদিত (২ য় প্যারা)।
গোল্ডলোকস

আপনি প্রয়োজন নেই ifব্যবহারের test, আগে আপনি এটি ব্যবহার করতে পারেন &&, ||অথবা পরে whileঅথবা ব্যবহার ফলাফলের পরীক্ষা$?
Jasen

8
[ x$1 = x ]

শুধুমাত্র মধ্যে অর্থে zshxএটি স্ক্রিপ্টের প্রথম যুক্তির সাথে যুক্তটির তুলনা করে x। সুতরাং [কমান্ডটি সত্য হয় যদি $1খালি থাকে বা সরবরাহ না করা হয়।

[ $1 = "" ]

কাজ, কারণ নেই হবে zshএকটি খালি পরিবর্তনশীল তালিকা প্রেক্ষিতে উদ্ধৃত না থাকে, তখন তা একটি খালি যুক্তি পরিবর্তে সব সময়ে কোন যুক্তি বিস্তৃতি, তাই যদি $1সেট না বা খালি ছিল, [কমান্ড শুধুমাত্র আর্গুমেন্ট হিসাবে পাবে [, =, খালি স্ট্রিং এবং ]এটি এর অর্থ বুঝতে পারে না। [ -z "$1" ]বা [ "$1" = "" ]পসিক্স শেলের মতো হলেও ঠিক আছে।

বোর্ন-জাতীয় / পসিক্স শেলগুলিতে, এটি [ x$1 = x ]বোঝা যায় না। এটিই বিভাজন + গ্লোব অপারেটরটি কোনওভাবে xস্ক্রিপ্টের একত্রিতকরণ এবং প্রথম যুক্তির উপর প্রয়োগ করে আশা করেছিল যে ফলাফল এবং =এবং x, এবং কমান্ডের ]জন্য একটি বৈধ পরীক্ষামূলক অভিব্যক্তি তৈরি করবে [

উদাহরণস্বরূপ, যদি আপনার স্ক্রিপ্টটি এক পাস হয় " = x -o x ="যুক্তি, [সেই আর্গুমেন্ট গ্রহণ হবে: [, x, =, x, -o, x, =, x, ], যা [তুলনা যেমন বুঝতে হবে xসঙ্গে xএবং xসঙ্গে xএবং সত্য ফিরে।

যদি $1তা হয় "* *", তবে শেলটি [বর্তমান ডিরেক্টরিটিতে ফাইলগুলির তালিকা কমান্ডের কাছে যাবে যার নাম x(গ্লোব সম্প্রসারণ x*) দিয়ে শুরু হয় , তবে অ-লুকানো ফাইলগুলির তালিকা (সম্প্রসারণ *) ... যা [সম্ভব হবার সম্ভাবনা নেই কোন ধারণা তৈরি করা। $1ওয়াইল্ডকার্ড বা ফাঁকা অক্ষর না থাকলে কেবলমাত্র যেগুলি বুদ্ধিমান কিছু করতে পারে is

এখন, আপনি মাঝে মাঝে যা দেখতে পান তা কোডের মতো:

[ "x$1" = x ]

$1এটি খালি বা আনসেট না থাকলে পরীক্ষা করতে ব্যবহৃত হয় ।

খালি বা আনসেট ভেরিয়েবলের পরীক্ষা করার স্বাভাবিক উপায় হ'ল:

[ -z "$1" ]

তবে সোলারিস 10-তে পাওয়া কিছু বোর্ন শেল যেমন বিল্টিন - এর $1মতো =এবং কিছুটা পুরানো সংস্করণ (0.5.4 অবধি) বা কিছু বিএসডি এর মতো কিছু (নন-পসিক্স) [বাস্তবায়নের মতো কিছু মানের জন্য এটি ব্যর্থ /bin/shহয় ।dashsh

এটার কারন [দেখেন [, -z, =, ]এবং আর্গুমেন্ট অনুপস্থিত সম্পর্কে অভিযোগ =বাইনারি অপারেটর পরিবর্তে এটা বুঝতে হিসাবে -zইউনারী অপারেটর প্রয়োগ =পংক্তি।

একইভাবে, [ "$1" = "" ]কিছু বাস্তবায়নের ব্যর্থ [যদি $1হয় !বা (

এই শেল / [বাস্তবায়নে:

[ "x$1" = x ]

এর মান নির্বিশেষে সর্বদা একটি বৈধ পরীক্ষা $1, তাই হয়:

[ "" = "$1" ]

এবং:

[ -z "${1:+x}" ]

এবং

case $1 in "") ...; esac

অবশ্যই, আপনি যদি কোনও যুক্তি সরবরাহ করা হয় না তা পরীক্ষা করতে চান তবে আপনি তা করতে পারেন:

[ "$#" -eq 0 ]

অর্থাৎ, আপনি স্ক্রিপ্টে কতগুলি আর্গুমেন্ট পাস করেছেন তা পরীক্ষা করে দেখুন।

লক্ষ্য করুন আজকাল [ -z "$var" ]পরিষ্কারভাবে POSIX দ্বারা নির্দিষ্ট করা হয় এবং conformant ব্যর্থ করতে পারবে না [বাস্তবায়নের (এবং bashএর [নেই এবং কয়েক দশক ধরে হয়েছে)। সুতরাং আপনার পসিক্স শ বা bashস্ক্রিপ্টগুলিতে নির্ভর করতে সক্ষম হওয়া উচিত ।


0

x$1দুটি স্ট্রিংকে সংমিশ্রিত করছে xএবং $1এবং যদি $ 1 খালি থাকে তবে x $ 1 টি সমান x, এবং [x $ 1 = x] ফলস্বরূপ সত্য হবে। x = ysh এ স্ট্রিং তুলনা করতে ব্যবহৃত হয়


2
কোনও x$1উদ্ধৃত হয় না, সুতরাং বিভক্তকরণ এবং গ্লোববিং তাদের উপর সঞ্চালিত হয়।
স্টাফেন চেজেলাস

0

[ x$1 = x ]যদি $1আনসেট / নাল / ফাঁকা থাকে বা না হয় তবে এটি সত্য ।
নিজেকে দিয়ে চেষ্টা করুন:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
এবং
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"


1
[ x$1 = x ]$1উদাহরণস্বরূপ যদি সত্য হয় " -o x"। ব্যবহার করে দেখুন sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'[ x$1 = x ]ভুল এবং কোন মানে নেই।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.