<Precedenti | Contenuti | Succ.>
Operazioni sulle stringhe
Esiste un ampio set di espansioni che possono essere utilizzate per operare sulle stringhe. Molte di queste espansioni sono particolarmente adatte per operazioni sui percorsi.
${#parametro}
si espande nella lunghezza della stringa contenuta da parametro. Normalmente, parametro è una stringa; tuttavia, se parametro è l'uno o l'altro @ or *, quindi l'espansione determina il numero di parametri posizionali.
[io@linuxbox~]$ foo="Questa stringa è lunga."
[io@linuxbox~]$ echo "'$foo' è lungo ${#foo} caratteri."
'Questa stringa è lunga.' è lunga 20 caratteri.
[io@linuxbox~]$ foo="Questa stringa è lunga."
[io@linuxbox~]$ echo "'$foo' è lungo ${#foo} caratteri."
'Questa stringa è lunga.' è lunga 20 caratteri.
${parametro:offset}
${parametro:offset:lunghezza}
Queste espansioni vengono utilizzate per estrarre una porzione della stringa contenuta in parametroL'estrazione inizia a offset caratteri dall'inizio della stringa e continua fino alla fine della stringa, a meno che il lunghezza è specificato.
[io@linuxbox~]$ foo="Questa stringa è lunga."
[io@linuxbox~]$ eco ${foo:5}
la stringa è lunga.
[io@linuxbox~]$ eco ${foo:5:6}
stringa
[io@linuxbox~]$ foo="Questa stringa è lunga."
[io@linuxbox~]$ eco ${foo:5}
la stringa è lunga.
[io@linuxbox~]$ eco ${foo:5:6}
stringa
Se il valore di offset è negativo, si intende che inizia dalla fine della stringa piuttosto che dall'inizio. Si noti che i valori negativi devono essere preceduti da uno spazio per evitare confusione con ${parametro:-parola} espansione. lunghezza, se presente, non deve essere inferiore a zero.
If parametro is @, il risultato dell'espansione è lunghezza parametri posizionali, a partire da
compensare.
[io@linuxbox~]$ foo="Questa stringa è lunga."
[io@linuxbox~]$ echo ${foo: -5}
lungo.
[io@linuxbox~]$ eco ${foo: -5:2}
lo
[io@linuxbox~]$ foo="Questa stringa è lunga."
[io@linuxbox~]$ echo ${foo: -5}
lungo.
[io@linuxbox~]$ eco ${foo: -5:2}
lo
${parametro#modello}
${parametro##modello}
Queste espansioni rimuovono una parte iniziale della stringa contenuta in parametro definito da modello. modello è un modello jolly come quelli utilizzati nell'espansione del percorso. La differenza tra le due forme è che # il modulo rimuove la corrispondenza più breve, mentre il ## il modulo rimuove la corrispondenza più lunga.
[io@linuxbox~]$ foo=file.txt.zip [io@linuxbox~]$ echo ${foo#*.} txt.zip
[io@linuxbox~]$ echo ${foo##*.}
chiusura
[io@linuxbox~]$ foo=file.txt.zip [io@linuxbox~]$ echo ${foo#*.} txt.zip
[io@linuxbox~]$ echo ${foo##*.}
chiusura
${parametro%modello}
${parametro%%modello}
Queste espansioni sono le stesse di # e ## espansioni sopra, tranne per il fatto che rimuovono il testo dalla fine della stringa contenuta in parametro piuttosto che dall'inizio.
[io@linuxbox~]$ foo=file.txt.zip
[io@linuxbox~]$ foo=file.txt.zip
[io@linuxbox~]$ echo ${foo%.*}
file.txt
[io@linuxbox~]$ echo ${foo%%.*}
filetto
[io@linuxbox~]$ echo ${foo%.*}
file.txt
[io@linuxbox~]$ echo ${foo%%.*}
filetto
${parametro/modello/stringa}
${parametro//modello/stringa}
${parametro/#modello/stringa}
${parametro/%modello/stringa}
Questa espansione esegue una ricerca e sostituzione sul contenuto di parametroSe viene trovato del testo corrispondente al carattere jolly modello, viene sostituito con il contenuto di stringaNella forma normale, solo la prima occorrenza di modello viene sostituito. Nel // modulo, tutte le occorrenze vengono sostituite. Il /# la forma richiede che la corrispondenza si verifichi all'inizio della stringa e /% Il modulo richiede che la corrispondenza avvenga alla fine della stringa. In ogni modulo, /stringa può essere omesso, causando la corrispondenza del testo con modello da eliminare.
[io@linuxbox~]$ foo=JPG.JPG [io@linuxbox~]$ eco ${foo/JPG/jpg} jpg.JPG
[io@linuxbox~]$ echo ${foo//JPG/jpg}
jpg.jpg
[io@linuxbox~]$ echo ${foo/#JPG/jpg}
jpg.JPG
[io@linuxbox~]$ echo ${foo/%JPG/jpg}
JPG.jpg
[io@linuxbox~]$ foo=JPG.JPG [io@linuxbox~]$ eco ${foo/JPG/jpg} jpg.JPG
[io@linuxbox~]$ echo ${foo//JPG/jpg}
jpg.jpg
[io@linuxbox~]$ echo ${foo/#JPG/jpg}
jpg.JPG
[io@linuxbox~]$ echo ${foo/%JPG/jpg}
JPG.jpg
L'espansione dei parametri è una buona cosa da sapere. Le espansioni di manipolazione delle stringhe possono essere utilizzate come sostituti di altri comandi comuni come sete e taglioLe espansioni possono migliorare l'efficienza degli script eliminando l'uso di programmi esterni. Ad esempio, modificheremo il parola più lunga programma discusso nel capitolo precedente per utilizzare l'espansione dei parametri ${#j} al posto della sostituzione del comando $(eco
-n $j | wc -c) e la sua sottoshell risultante, in questo modo:
#! / Bin / bash
# longest-word3: trova la stringa più lunga in un file per i; fai
se [[ -r $i ]]; allora max_word= max_len=0
#! / Bin / bash
# longest-word3: trova la stringa più lunga in un file per i; fai
se [[ -r $i ]]; allora max_word= max_len=0
per j in $(stringhe $i); fai
lunghezza=${#j}
se ((len > max_len )); allora max_len=$len max_word=$j
fi
fatto
echo "$i: '$max_word' ($max_len caratteri)"
fi fatto
per j in $(stringhe $i); fai
lunghezza=${#j}
se ((len > max_len )); allora max_len=$len max_word=$j
fi
fatto
echo "$i: '$max_word' ($max_len caratteri)"
fi fatto
Successivamente, confronteremo l'efficienza delle due versioni utilizzando il tempo comando:
[io@linuxbox~]$ tempo parola più lunga2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caratteri)
[io@linuxbox~]$ tempo parola più lunga2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caratteri)
di rose
Utente
0m3.618s
0m1.544s
di rose
Utente
sistema 0m1.768s
[io@linuxbox~]$ tempo parola più lunga3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caratteri)
sistema 0m1.768s
[io@linuxbox~]$ tempo parola più lunga3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caratteri)
di rose
Utente
0m0.060s
0m0.056s
di rose
Utente
sistema 0m0.008s
sistema 0m0.008s
La versione originale dello script impiega 3.618 secondi per analizzare il file di testo, mentre la nuova versione, utilizzando l'espansione dei parametri, impiega solo 0.06 secondi - un miglioramento molto significativo.