শেল = পরীক্ষা করে চলকটি # দিয়ে শুরু হয় কিনা


16

ভেরিয়েবলের বিষয়বস্তু হ্যাশ সাইন দিয়ে শুরু হয় কিনা তা নির্ধারণ করতে কীভাবে আপনি আমাকে নির্ধারণ করতে সাহায্য করতে পারলে আমি ধন্যবাদ জানব:

#!bin/sh    

myvar="#comment asfasfasdf"

if [ myvar = #* ] 

এটা কাজ করে না.

ধন্যবাদ!

Jans


1
আমি "সম্ভাব্যতা " পরীক্ষা করার সময় হ্যাশ ট্যাগের আগে ফাঁকা স্থান থাকতে পারে এমন সম্ভাবনাটি বিবেচনা করব , যদি এটি যদি আপনি সত্যিই করছেন তবে।
rthomson

আপনি যেমন একটি উত্তর গ্রহণ করেছেন যার মধ্যে একটি bashসমাধান জড়িত রয়েছে , সম্ভবত আপনি আপনার প্রশ্নটি সম্পাদনা করতে পারেন, কারণ এটি বোঝা যাচ্ছে যে আপনি কোনও sh/ dashসমাধানের জন্য চাইছেন।
চার্লস রবার্তো কানাটো

আমি #!লাইনে একটি নিখুঁত পথটি সেই লাইনের আপেক্ষিক পথ হিসাবে ব্যবহার করার পরামর্শ দিচ্ছি যেখানে স্ক্রিপ্টটি রয়েছে তার তুলনায় স্ক্রিপ্টটি সম্পাদনকারী প্রক্রিয়াটির বর্তমান ডিরেক্টরিটির সাথে আপাতভাবে আপত্তি করা হয়েছে।
ক্যাস্পারড

উত্তর:


20

আপনি হ্যাশ থেকে বাঁচলে আপনার আসল পদ্ধতির কাজটি ঠিকঠাক হবে :

$ [[ '#snort' == \#* ]]; echo $?
0

"সাবস্ট্রিং এক্সপেনশন" ব্যবহার করে ভেরিয়েবলের সামগ্রীর প্রথম চরিত্রটি ছড়িয়ে দিয়ে অন্য একটি পদ্ধতির ব্যবহার করা হবে:

if [[ ${x:0:1} == '#' ]]
then
    echo 'yep'
else
    echo 'nope'
fi

yep

বাশ ম্যান পৃষ্ঠা থেকে:

   ${parameter:offset}
   ${parameter:offset:length}
          Substring  Expansion.   Expands  to  up  to length characters of
          parameter starting at the character  specified  by  offset.   If
          length  is omitted, expands to the substring of parameter start-
          ing at the character specified by offset.  length and offset are
          arithmetic   expressions   (see  ARITHMETIC  EVALUATION  below).
          length must evaluate to a number greater than or equal to  zero.
          If  offset  evaluates  to  a number less than zero, the value is
          used as an offset from the end of the value  of  parameter.   If
          parameter  is  @,  the  result  is  length positional parameters
          beginning at offset.  If parameter is an array name indexed by @
          or  *,  the  result is the length members of the array beginning
          with ${parameter[offset]}.  A negative offset is taken  relative
          to  one  greater  than the maximum index of the specified array.
          Note that a negative offset must be separated from the colon  by
          at  least  one  space to avoid being confused with the :- expan-
          sion.  Substring indexing is zero-based  unless  the  positional
          parameters are used, in which case the indexing starts at 1.

এই ম্যান পৃষ্ঠাটি দেখতে আমার কি টাইপ করা উচিত?
দুলেশি

এটি বাশ ম্যান পৃষ্ঠা, সুতরাং এটি " man bash" করা উচিত।
ইনসিটে

2
এটি বাশিজম, তবে ট্যাগটি "শেল" সম্পর্কে "বাশ" নয় :(।
পেভিক

11

পসিক্স-সামঞ্জস্যপূর্ণ সংস্করণ:

[ "${var%${var#?}}"x = '#x' ] && echo yes

বা:

[ "${var#\#}"x != "${var}x" ] && echo yes

বা:

case "$var" in
    \#*) echo yes ;;
    *) echo no ;;
esac

1
পোস্টের উত্তরের জন্য +1। কিছু প্রাথমিক সময় পরীক্ষায়, caseমোটামুটি পুরানো 32-বিট x86 কম্পিউটারে এই পদ্ধতিটি তিনটির মধ্যে দ্রুততম বলে মনে হয়। সকল তিনটি পর্যন্ত আরো একটি সহজ উদাহরণ তুলনায় দক্ষ যা মত একটি forked stdin প্রসেসর পাইপ: echo $var | cut -c1। আমার বিশ্লেষণটি কেবলমাত্র একটি কম্পিউটার / ওএস - ওয়াইএমএমভি-তে 10,000,000 পুনরাবৃত্তির উপর ভিত্তি করে বেশ বেসিক ছিল। আমি কোনও ধরণের পার্থক্য অতিরঞ্জিত করতে এবং আরও দৃশ্যমান করতে এই ধীর কম্পিউটারটি ব্যবহার করেছি - কমপক্ষে একটি প্ল্যাটফর্মে।
হুয়ান

বিটিডব্লিউ, এই 10,000,000 পুনরাবৃত্তির জন্য, এই উত্তরে বর্ণিত বিল্টিন পদ্ধতিগুলি প্রায় এক মিনিট (পূর্বোক্ত ধীর বাক্সে) দৌড়েছিল। cutস্বাদে পাইপটি 5+ ঘন্টা সময় নেয়।
হুয়ান

আপনি কী দিয়ে শুরু জিনিসগুলি পেতে চান "
জাস্টিন

5

আমি জানি যে এটি ধর্মবিরোধী হতে পারে তবে এই ধরণের জিনিসগুলির জন্য আমি শেলের মধ্যে থেকে না করে বরং গ্রেপ বা এগ্রিপ ব্যবহার করব। এটি কিছুটা বেশি ব্যয়বহুল (আমার ধারণা) তবে আমার জন্য এই সমাধানটির পঠনযোগ্যতা এটি অফসেট করে। এটি অবশ্যই ব্যক্তিগত স্বাদের বিষয়, অবশ্যই।

তাই:

myvar="   #comment asfasfasdf"
if ! echo $myvar | egrep -q '^ *#'
then
  echo "not a comment"
else
  echo "commented out"
fi

এটি নেতৃত্বাধীন স্পেসগুলির সাথে বা ছাড়াই কাজ করে। আপনি যদি শীর্ষস্থানীয় ট্যাবগুলির জন্য অ্যাকাউন্ট করতে চান তবে এর পরিবর্তে egrep -q '^ [\ t] * #' ব্যবহার করুন।


এটি সম্পর্কে চিন্তা করা সম্ভবত আমি এগ্রেপ পছন্দ করি কারণ আমি রেজিক্সগুলি পছন্দ করি তবে আমি গ্রেপ / এড্রেপকে পরিস্থিতিগুলির বৃহত্তর ব্যবস্থায় দরকারী বলে মনে করি।
এডুয়ার্ডো ইভানেক

0

এখানে অন্য উপায় ...

# assign to var the value of argument actual invocation
var=${1-"#default string"}

if [[ "$var" == "#"* ]]
then
  echo "$var starts with a #"
fi

কেবল কোনও ফাইলটিতে সামগ্রীটি অনুলিপি করুন, কার্যকরকরণের অনুমতি দিন এবং এটি কীভাবে কাজ করে তা দেখুন;)।

আশা করি এটা সাহায্য করবে!

গ্রিটিংস।


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