У меня есть следующий скрипт для запуска процесса MySQL:
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
Что означает 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 в этом контексте?
Ответы:
Это тест для -
опции пунктирного аргумента, по-видимому. Это немного странно, правда. Он использует нестандартное bash
расширение в попытке извлечь первый и только первый символ из $1
. Индекс 0
заголовка и 1
длина строки. В , [
test
как , что он также может быть:
[ " -${1#?}" = " $1" ]
Однако ни одно из этих сравнений не подходит test
, поскольку оно также интерпретирует -
пунктирные аргументы - вот почему я использую пробел там.
Лучший способ сделать это - и как это обычно делается - это:
case $1 in -*) mysqld_safe "$@"; esac
${1:0:1}
является длиной, а не индексом.
[[
: [[ $1 == -* ]]
.
[[ : [[
?
[[
- это просто имя синтаксиса, а двоеточие - просто пунктуация.
Это займет подстроку $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.
Он проверяет, что первый символ первого аргумента $1
является тире -
.
1: 0: 1 являются значениями для расширения параметра: ${parameter:offset:length}
.
Это значит:
1
, то есть:$1
0
(пронумеровано от 0).Короче говоря: первый символ первого позиционного параметра $1
.
Расширение этого параметра доступно в ksh, bash, zsh (как минимум).
Если вы хотите изменить тестовую строку:
[ "${1:0:1}" = "-" ]
Другими более безопасными решениями bash могут быть:
[[ $1 =~ ^- ]]
[[ $1 == -* ]]
Безопаснее, потому что в этом нет проблем с цитированием (внутри не выполняется разбиение [[
)
Для более старых, менее способных оболочек можно изменить на:
[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}" = "-" ]
case $1 in -*) set -- mysqld_safe "$@";; esac
Только команда case более устойчива к неправильному цитированию.