Значение

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

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

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

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 более устойчива к неправильному цитированию.

  • Как найти все файлы с файлом формата Heena_Report_MMDDYYY.CSV через команду Unix с даты марта 2016 года до даты?
  • SH-процесс использует 50% процессора, почему?
  • bash - очереди подсетей
  • Преобразовать ascii-код в шестнадцатеричный в сценарии оболочки UNIX
  • Команда принудительной оболочки для возврата
  • Как понять порядок между расширениями?
  • «. ~ / .bashrc "не устанавливает переменные, как ожидалось, в вызывающем скрипте
  • CGI с Shell Script
  • Удалите файлы в каталоге, которые соответствуют регулярному выражению, используя терминал Mac
  • Перенаправление stdout и stderr все еще печатает на stdout
  • Режим vi не отображается корректно на новом терминале
  • Interesting Posts

    Как сделать аргумент cd аргументов нечувствительным?

    ntpd vs. systemd-timesyncd – Как добиться надежной синхронизации NTP?

    Когда я убил пользователя root tty1 на ubuntu14.04, система перезагрузится. Зачем?

    Простой способ надежно подключить 2 машины через Ethernet-кабель?

    ufw: как переместить один порт в другой порт на другом интерфейсе

    Поиск устройства char в / sys с использованием сценария Bash?

    SSH с использованием учетных данных OpenLDAP (LDAP)

    Какова цель абстракций, сеанса, лидера сеанса и групп процессов?

    Что на самом деле происходит, когда контрольная сумма выходит из строя для файла с использованием btrfs?

    Что такое ac_nonexistent.h?

    Является ли наложение псевдослучайной команды на ядро?

    Является ли oops ядра, зараженного промежуточным устройством, менее вероятным для изучения?

    Печатать символ табуляции в рыбе

    Добавить вторую аутентификацию для входа пользователя в систему

    Оболочка сценария скрипта условно

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