<Anterior | Conteúdo | Próxima>
Operações de String
Existe um grande conjunto de expansões que podem ser usadas para operar em cordas. Muitas dessas expansões são particularmente adequadas para operações em nomes de caminho.
$ {#parâmetro}
se expande no comprimento da string contida por parâmetro. Normalmente, parâmetro é uma string; entretanto, se parâmetro é também @ or *, então a expansão resulta no número de parâmetros posicionais.
[me @ linuxbox ~] $ foo = "Esta corda é longa."
[me @ linuxbox ~] $ echo "'$ foo' tem $ {# foo} caracteres."
'Esta corda é longa.' tem 20 caracteres.
[me @ linuxbox ~] $ foo = "Esta corda é longa."
[me @ linuxbox ~] $ echo "'$ foo' tem $ {# foo} caracteres."
'Esta corda é longa.' tem 20 caracteres.
${parâmetro:compensar}
${parâmetro:compensar:comprimento}
Essas expansões são usadas para extrair uma parte da string contida em parâmetro. A extração começa em compensar caracteres do início da string e continua até o final da string, a menos que o comprimento é especificado.
[me @ linuxbox ~] $ foo = "Esta corda é longa."
[me @ linuxbox ~] $ echo $ {foo: 5}
string é longa.
[me @ linuxbox ~] $ echo $ {foo: 5: 6}
corda
[me @ linuxbox ~] $ foo = "Esta corda é longa."
[me @ linuxbox ~] $ echo $ {foo: 5}
string é longa.
[me @ linuxbox ~] $ echo $ {foo: 5: 6}
corda
Se o valor de compensar for negativo, significa que começa no final da string, e não no início. Observe que os valores negativos devem ser precedidos por um espaço para evitar confusão com o ${parâmetro:-palavra} expansão. comprimento, se presente, não deve ser menor que zero.
If parâmetro is @, o resultado da expansão é comprimento parâmetros posicionais, começando em
Deslocamento.
[me @ linuxbox ~] $ foo = "Esta corda é longa."
[me @ linuxbox ~] $ echo $ {foo: -5}
longo.
[me @ linuxbox ~] $ echo $ {foo: -5: 2}
lo
[me @ linuxbox ~] $ foo = "Esta corda é longa."
[me @ linuxbox ~] $ echo $ {foo: -5}
longo.
[me @ linuxbox ~] $ echo $ {foo: -5: 2}
lo
${parâmetro#de cinto de segurança}
${parâmetro##de cinto de segurança}
Essas expansões removem uma parte dianteira da corda contida em parâmetro definido por de cinto de segurança. de cinto de segurança é um padrão curinga como aqueles usados na expansão do nome do caminho. A diferença nas duas formas é que o # forma remove a correspondência mais curta, enquanto o ## formulário remove a correspondência mais longa.
[me @ linuxbox ~] $ foo = file.txt.zip [me @ linuxbox ~] $ echo $ {foo # *.} txt.zip
[me @ linuxbox ~] $ echo $ {foo ## *.}
zip
[me @ linuxbox ~] $ foo = file.txt.zip [me @ linuxbox ~] $ echo $ {foo # *.} txt.zip
[me @ linuxbox ~] $ echo $ {foo ## *.}
zip
${parâmetro%de cinto de segurança}
${parâmetro%%de cinto de segurança}
Essas expansões são iguais ao # e ## expansões acima, exceto que removem o texto do final da string contida em parâmetro em vez de desde o início.
[me @ linuxbox ~] $ foo = file.txt.zip
[me @ linuxbox ~] $ foo = file.txt.zip
[me @ linuxbox ~] $ echo $ {foo%. *}
arquivo.txt
[me @ linuxbox ~] $ echo $ {foo %%. *}
lima
[me @ linuxbox ~] $ echo $ {foo%. *}
arquivo.txt
[me @ linuxbox ~] $ echo $ {foo %%. *}
lima
${parâmetro/de cinto de segurança/corda}
${parâmetro//de cinto de segurança/corda}
${parâmetro/#de cinto de segurança/corda}
${parâmetro/%de cinto de segurança/corda}
Esta expansão executa uma busca e substituição no conteúdo de parâmetro. Se for encontrado um texto correspondente ao curinga de cinto de segurança, é substituído pelo conteúdo de corda. Na forma normal, apenas a primeira ocorrência de de cinto de segurança É substituído. No // formulário, todas as ocorrências são substituídas. O /# forma requer que a correspondência ocorra no início da string, e o /% forma requer que a correspondência ocorra no final da string. Em todas as formas, /corda pode ser omitido, fazendo com que o texto correspondido por de cinto de segurança Para ser deletado.
[me @ linuxbox ~] $ foo = JPG.JPG [me @ linuxbox ~] $ echo $ {foo / JPG / jpg} jpg.JPG
[me @ linuxbox ~] $ echo $ {foo // JPG / jpg}
jpg.jpg
[me @ linuxbox ~] $ echo $ {foo / # JPG / jpg}
jpg.JPG
[me @ linuxbox ~] $ echo $ {foo /% JPG / jpg}
JPG.jpg
[me @ linuxbox ~] $ foo = JPG.JPG [me @ linuxbox ~] $ echo $ {foo / JPG / jpg} jpg.JPG
[me @ linuxbox ~] $ echo $ {foo // JPG / jpg}
jpg.jpg
[me @ linuxbox ~] $ echo $ {foo / # JPG / jpg}
jpg.JPG
[me @ linuxbox ~] $ echo $ {foo /% JPG / jpg}
JPG.jpg
É bom saber a expansão de parâmetros. As expansões de manipulação de string podem ser usadas como substitutos para outros comandos comuns, como sede e corte. As expansões podem melhorar a eficiência dos scripts, eliminando o uso de programas externos. Por exemplo, vamos modificar o palavra mais longa programa discutido no capítulo anterior para usar a expansão de parâmetro $ {# j} no lugar da substituição do comando $ (eco
-n $ j | wc -c) e sua subcamada resultante, assim:
#! / Bin / bash
# longest-word3: encontra a string mais longa em um arquivo para i; Faz
if [[-r $ i]]; então max_word = max_len = 0
#! / Bin / bash
# longest-word3: encontra a string mais longa em um arquivo para i; Faz
if [[-r $ i]]; então max_word = max_len = 0
para j em $ (strings $ i); Faz
len = $ {# j}
if ((len> max_len)); então max_len = $ len max_word = $ j
fi
feito
echo "$ i: '$ max_word' ($ max_len caracteres)"
fi feito
para j em $ (strings $ i); Faz
len = $ {# j}
if ((len> max_len)); então max_len = $ len max_word = $ j
fi
feito
echo "$ i: '$ max_word' ($ max_len caracteres)"
fi feito
A seguir, compararemos a eficiência das duas versões usando o tempo comando:
[me @ linuxbox ~] $ tempo palavra mais longa2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caracteres)
[me @ linuxbox ~] $ tempo palavra mais longa2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caracteres)
reais
usuário
0m3.618s
0m1.544s
reais
usuário
sistema 0m1.768s
[me @ linuxbox ~] $ tempo palavra mais longa3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caracteres)
sistema 0m1.768s
[me @ linuxbox ~] $ tempo palavra mais longa3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 caracteres)
reais
usuário
0m0.060s
0m0.056s
reais
usuário
sistema 0m0.008s
sistema 0m0.008s
A versão original do script leva 3.618 segundos para digitalizar o arquivo de texto, enquanto a nova versão, usando a expansão do parâmetro, leva apenas 0.06 segundos - uma melhoria muito significativa.