MySQLプロセスを開始するための次のスクリプトがあります。
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
この文脈では、1:0:1 とはどういう意味ですか?
答え1
-
明らかに、これはドットで区切られたパラメータオプションのテストです。実はちょっと変です。非標準bash
拡張を使用して、最初の文字と最初の文字のみを抽出しようとします$1
。0
ヘッダー文字インデックスで、文字列の1
長さです。[
test
同様の状況では、次のような場合があります。
[ " -${1#?}" = " $1" ]
しかし、両比較とも点線引数も解釈するので特に適していない。これが私がそこで先行するスペースを使用する理由ですtest
。-
この種のタスクを実行する最良の方法と一般的に実行される方法は次のとおりです。
case $1 in -*) mysqld_safe "$@"; esac
答え2
$1
文字0から文字1までの部分文字列を使用してください。したがって、文字列の最初の文字と最初の文字のみが得られます。
bash
3.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コマンドだけが間違った参照に対して強いです。