Uma versão antigaipconfig
de (dentro do initramfs) requer que a entrada do usuário forneça apenas até 7 elementos separados por dois pontos, como:
ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
resultar em um ipconfig
erro quando os usuários fornecem mais de 7 elementos.
Portanto, o extra (2 resolvedores de DNS) deve ser cortado.
Isso pode ser feito dentro de um subshell
with cut
, como:
validated_input=$(echo ${user_input} | cut -f1,2,3,4,5,6,7 -d:)
Como isso pode cut
ser escrito usando (b)ash
expansão/substituição de parâmetros?
Sem:
- lançamento de subshell(s)/subprocesso(s) (piping)
- IFS-wrangling/mangling
Devido à (1) velocidade, consulte Usando a substituição de variável bash em vez de cut/awk e (2) aprendizado.
Em outras palavras: Como fazer uma pesquisa para a n-ésima (7ª) ocorrência de caractere e remover/aparar tudo daí até o final da string?
Com uma regex:
Isso deve funcionar no shell padrão:
Ou se permitirmos a configuração
IFS
pela duração deread
:Isso usa apenas expansão de parâmetro:
Exemplo :
Obrigado ilkkachu por vir com uma correção para o trailing
:
!Isso tentará corresponder ao início do seu parâmetro e, se corresponder, o removerá.
Exemplo :
Isso tentará corresponder ao final do seu parâmetro e, se corresponder, o removerá.
Exemplo :
Então na resposta:
(observe as aspas ao redor
${var#...}
para que seja tratado como uma string literal (não um padrão) a ser removido do final de$var
).Quando aplicado a:
${var#*:*:*:*:*:*:*:}
=morefields:another:youwantanother:haveanother:
Isso é expandido para dentro
${var%: ... }
assim:${var%:morefields:another:youwantanother:haveanother:}
Então você está dizendo me dê:
Mas corte
:morefields:another:youwantanother:haveanother:
a ponta.O Manual de Referência do Bash ( 3.5.3 )
Em
zsh
:${(s(:))var}
dividido em:
"${(@)...}"
: certifique-se de preservar os elementos vazios (como em"$@"
)${var[1,7]}
elementos 1 a 7${(j(:))var}
juntar elementos em:
Ou você pode fazer:
${var##pattern}
como em ksh, retire a parte inicial mais longa correspondente ao padrão.(M)
: expandido para a parte combinada em vez de removê-lax#
: 0 ou maisx
s (como regexp*
)(#c0,6)
de 0 a 6 do átomo anterior (como ksh's{x,y}(...)
)