У мене є наступний сценарій для запуску процесу 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}" = "-" ]
Іншими безпечнішими рішеннями для баш можуть бути:
[[ $1 =~ ^- ]]
[[ $1 == -* ]]
Безпечніше, оскільки це не має жодних проблем із цитуванням (не розбивається всередині [[
)
Для старих, менш здібних снарядів можна змінити:
[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}" = "-" ]
case $1 in -*) set -- mysqld_safe "$@";; esac
Тільки команда case більш стійка до неправильного котирування.