Значення ["$ {1: 0: 1}" = '-']


18

У мене є наступний сценарій для запуску процесу MySQL:

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

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

Що означає 1: 0: 1 у цьому контексті?


1
Мені б дуже хотілося знати відповідь, але я вважаю, що це занадто вузьке питання для СФ. Я голосую, щоб перенести його на сайт Unix.
Массімо

Відповіді:


19

Це -, мабуть, тест для пунктирного аргументу. Це трохи дивно, насправді. Він використовує нестандартне bashрозширення, намагаючись витягти з нього перший і єдиний перший символ $1. Індекс 0головного символу та 1довжина рядка. У [ testподібному випадку це також може бути:

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

Жодне порівняння не підходить, testхоча воно тлумачить -пунктирні аргументи - саме тому я використовую провідний простір там.

Найкращий спосіб зробити таку річ - і як це зазвичай робиться - це:

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

1
Закрити; число, що слідує за другою двокрапкою, ${1:0:1}- це довжина, а не індекс.
чепнер

У bashism чином з [[: [[ $1 == -* ]].
Arthur2e5

2
Особисто я не думаю, що це тут -буде проблемою test.. POSIX дає визначення значень за кількістю аргументів. Оскільки немає такого варіанту, який бере два аргументи, його слід безпечно писати в сирому вигляді.
Arthur2e5

@ Arthur2e5 - ти маєш рацію - вони не повинні бути проблемою - і, швидше за все, зовсім не є проблемними. це все ще дивний спосіб зробити це - він просто не підходить. що робить [[ : [[?
mikeserv

1
@mikeserv Ну, ви повинні подивитися на веб-сторінку (якщо ви читаєте це з іншого місця) .. Мій коментар був як "з START_CODE [[END_CODE: START_CODE [[$ 1 == - *]] END_CODE". Перша [[- це лише назва синтаксису, а двокрапка - це лише розділові знаки.
Arthur2e5

11

Це займе підрядку $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.

6

Це тестування, що перший символ першого аргументу $1- тире -.

1: 0: 1 є значеннями для розширення параметра: ${parameter:offset:length}.

Це означає:

  • Назва: названий параметр 1, тобто:$1
  • Початок: від першого символу 0(пронумеровано від 0).
  • Довжина: для 1 символу.

Якщо коротко: перший символ першого позиційного параметра $1.
Це розширення параметрів доступне в ksh, bash, zsh (принаймні).


Якщо ви хочете змінити тестову лінію:

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

Варіанти Bash

Іншими безпечнішими рішеннями для баш можуть бути:

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

Безпечніше, оскільки це не має жодних проблем із цитуванням (не розбивається всередині [[)

POSIXly варіанти.

Для старих, менш здібних снарядів можна змінити:

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

Тільки команда case більш стійка до неправильного котирування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.