Tengo el siguiente script para iniciar un proceso MySQL:
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
¿Qué significa 1: 0: 1 en este contexto?
Tengo el siguiente script para iniciar un proceso MySQL:
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
¿Qué significa 1: 0: 1 en este contexto?
Respuestas:
Es una prueba para una -
opción de argumento discontinuo, aparentemente. Es un poco extraño, de verdad. Utiliza una bash
expansión no estándar en un intento de extraer el primer y solo el primer personaje $1
. El 0
es el índice del carácter principal y la 1
longitud de la cadena. De manera [
test
similar, también podría ser:
[ " -${1#?}" = " $1" ]
Sin test
embargo, ninguna de las comparaciones es particularmente adecuada , ya que también interpreta -
argumentos discontinuos, razón por la cual uso el espacio inicial allí.
La mejor manera de hacer este tipo de cosas, y la forma en que generalmente se hace, es:
case $1 in -*) mysqld_safe "$@"; esac
${1:0:1}
es una longitud, no un índice.
[[
: [[ $1 == -* ]]
.
[[ : [[
hacer?
[[
es solo el nombre de sintaxis, y los dos puntos son solo una puntuación.
Esto va a tomar una subcadena del $1
0 al 1er carácter. Entonces obtendrá el primer carácter y solo el primer carácter de la cadena.
Desde la bash
página del manual 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.
Está probando que el primer carácter del primer argumento $1
es un guión -
.
El 1: 0: 1 son los valores para la expansión de parámetro: ${parameter:offset:length}
.
Eso significa:
1
, es decir:$1
0
(numerado desde 0).En resumen: el primer carácter del primer parámetro posicional $1
.
Esa expansión de parámetros está disponible en ksh, bash, zsh (al menos).
Si desea cambiar la línea de prueba:
[ "${1:0:1}" = "-" ]
Otras soluciones bash más seguras pueden ser:
[[ $1 =~ ^- ]]
[[ $1 == -* ]]
Más seguro porque esto no tiene problemas con las citas (no se ejecuta división dentro [[
)
Para conchas más viejas y menos capaces, se podría cambiar a:
[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}" = "-" ]
case $1 in -*) set -- mysqld_safe "$@";; esac
Solo el comando case es más resistente a las citas incorrectas.