Ho il seguente script per avviare un processo MySQL:
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
Cosa significa 1: 0: 1 in questo contesto?
Ho il seguente script per avviare un processo MySQL:
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
Cosa significa 1: 0: 1 in questo contesto?
Risposte:
È un test per -
un'opzione di argomento tratteggiata, a quanto pare. È un po 'strano, davvero. Utilizza bash
un'espansione non standard nel tentativo di estrarre il primo e solo il primo carattere $1
. Il 0
è l'indice carattere testa e 1
è la lunghezza della stringa. In un modo [
test
simile potrebbe anche essere:
[ " -${1#?}" = " $1" ]
Nessuno dei due confronti è particolarmente adatto test
, tuttavia, poiché interpreta anche -
argomenti tratteggiati, motivo per cui utilizzo lo spazio iniziale lì.
Il modo migliore per fare questo tipo di cose - e il modo in cui viene fatto di solito - è:
case $1 in -*) mysqld_safe "$@"; esac
${1:0:1}
è una lunghezza, non un indice.
[[
: [[ $1 == -* ]]
.
-
che questo sarà un problema per test
questo. POSIX fornisce definizioni dei significati in base al conteggio degli argomenti. Poiché non esiste tale opzione che accetta due argomenti, dovrebbe essere sicuro scriverlo in raw.
[[ : [[
fare?
[[
è solo il nome della sintassi e i due punti sono solo una punteggiatura.
Questo richiederà una sottostringa $1
dal 0 ° al 1 ° carattere. Quindi otterrai il primo carattere e solo il primo carattere della stringa.
Dalla bash
pagina man 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.
Sta testando che il primo carattere del primo argomento $1
è un trattino -
.
Il 1: 0: 1 sono i valori per il parametro di espansione: ${parameter:offset:length}
.
Questo significa:
1
, ovvero:$1
0
(numerato da 0).In breve: il primo carattere del primo parametro posizionale $1
.
L'espansione di quel parametro è disponibile in ksh, bash, zsh (almeno).
Se si desidera modificare la linea di test:
[ "${1:0:1}" = "-" ]
Altre soluzioni bash più sicure possono essere:
[[ $1 =~ ^- ]]
[[ $1 == -* ]]
Più sicuro perché questo non ha problemi con la quotazione (nessuna divisione viene eseguita all'interno [[
)
Per le shell meno recenti e meno capaci, potrebbe essere modificato in:
[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}" = "-" ]
case $1 in -*) set -- mysqld_safe "$@";; esac
Solo il comando case è più resistente alle quotazioni errate.