[ "${1:0:1}" = '-' ] 意味

[ "${1:0:1}" = '-' ] 意味

MySQLプロセスを開始するための次のスクリプトがあります。

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

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

この文脈では、1:0:1 とはどういう意味ですか?

答え1

-明らかに、これはドットで区切られたパラメータオプションのテストです。実はちょっと変です。非標準bash拡張を使用して、最初の文字と最初の文字のみを抽出しようとします$10ヘッダー文字インデックスで、文字列の1長さです。[ test同様の状況では、次のような場合があります。

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

しかし、両比較とも点線引数も解釈するので特に適していない。これが私がそこで先行するスペースを使用する理由ですtest-

この種のタスクを実行する最良の方法と一般的に実行される方法は次のとおりです。

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

答え2

$1文字0から文字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.

答え3

最初のパラメータの最初の文字がダッシュかどうかを$1テストしています-

1:0:1はパラメータ拡張値です${parameter:offset:length}

これは次のことを意味します。

  • name:名前付きパラメータ1、つまり:$1
  • 開始:最初の文字から始まります0(番号は0から始まります)。
  • 長さ:1文字。

つまり、最初の位置引数の最初の文字です$1
このパラメータ拡張は、(少なくとも)ksh、bash、zshで使用できます。


テストラインを変更するには:

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

バッシュオプション

より安全な他のbashソリューションは次のとおりです。

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

参照問題がないため、より安全です(内部的に分割は行われません[[)。

POSIX オプション。

古い、あまり強力なシェルでは、次のように変更できます。

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

caseコマンドだけが間違った参照に対して強いです。

関連情報