Значение

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

if [ "${1:0:1}" = '-' ]; then set -- mysqld_safe "$@" fi if [ "$1" = 'mysqld_safe' ]; then DATADIR="/var/lib/mysql" ... 

Что означает 1: 0: 1 в этом контексте?

  • Linux: перехват установления соединения
  • Сбросьте шаблон слова в конце строки, используя sed
  • Сценарий Bash с командой «выполнить» и странным регулярным выражением
  • Как распознать, какая виртуальная среда используется
  • Изменение формы курсора (или цвета) для указания режима vi в bash
  • Составные команды в && / || состояние
  • Пакет mv cronjob оставляет некоторые (не все) копии в источнике
  • Замена tmux на exec
  • Вызов pushd в сценарии оболочки
  • Вычислить средний размер файла
  • Как переименовать файлы с sed и csv
  • есть ли инструмент с открытым исходным кодом для измерения производительности процессора?
  • 3 Solutions collect form web for “Значение”

    По-видимому, это тест для оппонента. На самом деле это немного странно. Он использует нестандартное расширение bash , пытаясь извлечь первый и только первый символ из $1 . 0 – индекс символа головы, а 1 – длина строки. В этом test может также быть:

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

    Однако ни одно сравнение не особенно подходит для test , поскольку оно интерпретирует также пунктирные аргументы – вот почему я использую там ведущее пространство.

    Лучший способ сделать это – и, как это обычно делается, – это:

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

    Это займет подстроку в $1 от 0-го до 1-го символа. Таким образом, вы получите первый символ и только первый символ строки.

    Из bash 3.2 bash :

      ${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 символа.

    Короче: первый символ первого позиционного параметра $1 .
    Это расширение параметра доступно в ksh, bash, zsh (по крайней мере).


    Если вы хотите изменить тестовую строку:

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

    Параметры Bash

    Другие безопасные решения bash могут быть:

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

    Безопаснее, потому что у этого нет проблем с цитированием (без разделения внутри [[ )

    Параметры POSIXly.

    Для более старых, менее способных оболочек можно изменить на:

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

    Только команда case более устойчива к неправильному цитированию.

    Linux и Unix - лучшая ОС в мире.