Cosa significa $ {1: 0: 2} in questo contesto?


19

Sto esaminando il codice visualizzato di seguito e controlla l'input se gli argomenti riga / colonna iniziano con -ro -c. Cosa ${1:0:2}significa in questo contesto?

rowArgName="-r"
colArgName="-c"
if [ "${1:0:2}" != $rowArgName ] && [ "${1:0:2}" != $colArgName ]
then
   echo $correctCmdMsg >&2
   exit 1
fi

7
Dovresti includere la shell che stai usando nella domanda. Che è probabilmente bash.
Raphael Ahrens,

2
Questo sembra essere fatto per analizzare gli argomenti della riga di comando. Probabilmente vorrai sapere getopto getoptssemplificarti la vita (o la vita di chiunque lo abbia fatto).
Carlos Campderrós,

Risposte:


31

È un modello di shell di espansione di sottostringa (sottoclasse di espansione dei parametri).

Il formato è:

${parameter:offset:length}

e l'indicizzazione inizia da 0.

Supponiamo che tu abbia una variabile foo, quindi ${foo:0:2}restituisce i primi due caratteri (dalla posizione 0 ai successivi 2).

Esempio:

$ foo=spamegg
$ echo "${foo:0:2}"
sp

Nel tuo caso, il primo numero, si 1riferisce al nome della variabile $1, che è il primo argomento passato tramite la riga di comando (nel programma principale) o il primo argomento passato alla funzione.

Quindi nel tuo caso "${1:0:2}":

  • iniziare a estrarre la sottostringa a partire dall'indice 0, ovvero il primo carattere

  • e continua fino ai prossimi due caratteri

quindi dopo l'operazione otterrai i primi due caratteri (indicizzati a 0 e 1) della stringa di input.

I [ "${1:0:2}" != $rowArgName ]e [ "${1:0:2}" != $colArgName ]stanno verificando se la sottotringa di output è uguale ad altre stringhe.


1
In sostanza sta verificando se l'utente ha fornito $ 1 con -co -r, che probabilmente è stato meglio implementato congetopts
Sergiy Kolodyazhnyy

15

Un piccolo estratto di man bash:

$ {Parametro: Offset: lunghezza}

Espansione sottostringa . Si espande fino a lengthcaratteri del valore di parameteriniziare dal carattere specificato da offset. Se parametro è @, un array indicizzato sottoscritto da @o *, o un nome di array associativo, i risultati differiscono come descritto di seguito. Se lengthviene omesso, si espande nella sottostringa del valore di parameterinizio al carattere specificato da offset e che si estende fino alla fine del valore. length e offset sono espressioni aritmetiche (vedi VALUTAZIONE ARITMETICA di seguito).


5

Questa è una semplice estrazione di sottostringa da una variabile. La variabile in questione è il primo parametro dello script (che è 1).

Se ho una variabile, FOO, posso vedere i primi due caratteri del suo valore con ${FOO:0:2}. La stessa cosa si sta facendo nel tuo esempio con il primo argomento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.