2015-07-17 10 views
12

Sto cercando di prendere il suffisso di una stringa in Bash usando la sintassi della sottostringa ${string:pos}, ma non riesco a capire perché non funzionerà. Sono riuscito a semplificare la mia codice di esempio a questo:Come si prende un suffisso di una stringa in bash usando gli offset negativi?

STRING="hello world" 

POS=4 
echo ${STRING:POS} # prints "o world" 
echo ${STRING:4} # prints "o world" 

POS=-4 
echo ${STRING:POS} # prints "orld" 
echo ${STRING:-4} # prints "hello world" 

Le prime tre righe funzionano esattamente come ci si aspetta, ma perché la linea di stampa finale "hello world" invece di "orld"?

risposta

17

Perché :- è sintassi di espansione dei parametri su "Usa valori predefiniti".

Dal documentation:

Quando non si esegue espansione sottostringa, utilizzando il modulo descritto seguito (ad esempio, ‘: -’), test Bash per un parametro che è posto o nullo.

Così facendo ${STRING:-4} si sta effettivamente chiedendo bash di espandere STRING e se è impostata (non sono mai stati assegnati in precedenza) o null (una stringa nulla, stampato come '') che sostituirà l'espansione con 4. Nell'esempio, STRING è impostato e quindi viene espanso al suo valore.

Come un'altra risposta afferma, è necessario scape l'espressione di non attivare il comportamento valore di default, il manuale specifica che:

Si noti che un offset negativo deve essere separato dal colon al almeno uno spazio per evitare di essere confuso con: - espansione.

Ad esempio:

${STRING:(-4)} 
${STRING: -4} 
+2

Bene , è deliziosamente ambiguo. – qntm

8

Hai bisogno di "fuga" dei parametri a partire con il precipitare con una parentesi o uno spazio, altrimenti bash tratterà come una stringa normale:

echo ${STRING:(-4)} 
echo ${STRING: -4} 
Problemi correlati