["$ {1: 0: 1}" = '-'] এর অর্থ


18

মাইএসকিউএল প্রক্রিয়া চালু করার জন্য আমার কাছে নিম্নলিখিত স্ক্রিপ্ট রয়েছে:

if [ "${1:0:1}" = '-' ]; then
    set -- mysqld_safe "$@"
fi

if [ "$1" = 'mysqld_safe' ]; then
    DATADIR="/var/lib/mysql"
...

এই প্রসঙ্গে 1: 0: 1 এর অর্থ কী?


1
আমি উত্তরটি সত্যিই জানতে চাই, তবে আমার কাছে মনে হচ্ছে এটি এসএফের জন্য খুব জটিল একটি প্রশ্ন। আমি এটিকে ইউনিক্স সাইটে স্থানান্তরিত করতে ভোট দিচ্ছি।
ম্যাসিমো

উত্তর:


19

-স্পষ্টতই, এটি কোনও ড্যাশড আর্গুমেন্ট বিকল্পের জন্য একটি পরীক্ষা । সত্যিই কিছুটা অদ্ভুত। এটি bashথেকে প্রথম এবং একমাত্র প্রথম চরিত্রটি বের করার প্রয়াসে এটি একটি মানহীন সম্প্রসারণ ব্যবহার করে $10মাথা চরিত্র সূচক এবং 1স্ট্রিং দৈর্ঘ্য হয়। একটি [ testমত এটি হতে পারে:

[ " -${1#?}" = " $1" ]

উভয়ই তুলনা বিশেষভাবে উপযুক্ত testনয়, কারণ এটি -ড্যাশযুক্ত যুক্তিগুলিরও ব্যাখ্যা করে - এজন্য আমি সেখানে শীর্ষস্থান ব্যবহার করি space

এই ধরণের জিনিস করার সর্বোত্তম উপায় - এবং এটি সাধারণত যেভাবে করা হয় তা হ'ল:

case $1 in -*) mysqld_safe "$@"; esac

1
বন্ধ করুন; দ্বিতীয় কোলনের নীচের সংখ্যাটি ${1:0:1}একটি দৈর্ঘ্য, কোনও সূচক নয়।
চ্যানার

সঙ্গে একটি bashism ভাবে [[: [[ $1 == -* ]]
আর্থার 2e5

2
ব্যক্তিগতভাবে আমি মনে করি না যে এগুলি এখানে -সমস্যা হয়ে উঠবে test.. পসিএক্স আর্গুমেন্ট গণনা দ্বারা অর্থগুলির সংজ্ঞা দেয়। যেহেতু দুটি বিকল্প যুক্তিযুক্ত এমন কোনও বিকল্প নেই, তাই এটি কাঁচা লেখা নিরাপদ হওয়া উচিত।
আর্থার 2e5

@ আর্থার 2e5 - আপনি ঠিক বলেছেন - এগুলির কোনও সমস্যা হওয়া উচিত নয় - এবং খুব সম্ভবত সমস্যাযুক্ত নয়। এটি এখনও যেতে একটি অদ্ভুত উপায় - এটি ঠিক ভাল ফিট করে না। কি করে [[ : [[?
মাইক্রজারভ

1
@ মিকসার্ভ ওয়েল আপনার ওয়েবপৃষ্ঠাটি দেখতে হবে (যদি আপনি অন্য কোথাও থেকে এটি পড়ছেন) .. আমার মন্তব্যটি 'START_CODE [[END_CODE: START_CODE [[$ 1 == - *]] END_CODE' এর মতো ছিল '। প্রথমটি [[হ'ল কেবল বাক্য গঠন এবং নামটি কেবল একটি বিরামচিহ্ন just
আর্থার 2e5

11

এটি $10 থেকে 1 ম চরিত্রের একটি স্ট্রিং নিতে চলেছে । সুতরাং আপনি প্রথম অক্ষর এবং স্ট্রিংয়ের প্রথম অক্ষর পেতে চলেছেন।

থেকে bash3.2 মানুষ পৃষ্ঠা:

  ${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.

6

এটি পরীক্ষা করছে যে প্রথম যুক্তির প্রথম চরিত্রটি $1একটি ড্যাশ -

1: 0: 1 পরামিতি বিস্তৃতির জন্য মান হল: ${parameter:offset:length}

এর মানে:

  • নাম: প্যারামিটারটির নামকরণ 1, অর্থাত:$1
  • শুরু: প্রথম অক্ষর 0থেকে (0 থেকে সংখ্যায়িত)।
  • দৈর্ঘ্য: 1 টি চরিত্রের জন্য।

সংক্ষেপে: প্রথম অবস্থানগত পরামিতির প্রথম অক্ষর $1
সেই প্যারামিটার সম্প্রসারণটি ksh, bash, zsh (কমপক্ষে) এ উপলব্ধ।


আপনি যদি পরীক্ষার লাইনটি পরিবর্তন করতে চান:

[ "${1:0:1}" = "-" ]

বাশ বিকল্পসমূহ

অন্যান্য নিরাপদ বাশ সমাধানগুলি হ'ল:

[[ $1 =~ ^- ]]
[[ $1 == -* ]]

নিরাপদ কারণ এর উদ্ধৃতিতে কোনও সমস্যা নেই (ভিতরে কোনও বিভাজন কার্যকর করা হবে না [[)

পজিক্লি বিকল্পসমূহ।

পুরানো, কম সক্ষম শেলগুলিতে, এতে পরিবর্তন করা যেতে পারে:

[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}"        = "-" ]
case $1 in  -*) set -- mysqld_safe "$@";; esac

শুধুমাত্র কেস কমান্ড ভুল উদ্ধৃতি প্রতিরোধী।

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