Bash substituiton parâmetro dentro dos comandos

3

Eu tenho um entendimento de passagem de Substituição de Parâmetro , incluindo substrings como p>

foo="Hello World";
greeting=${foo:0:6}

Mas eu faço isso com comandos?

greeting="Hello"
md5greeting=$(echo $greeting | md5sum :0:6)
>>b1946a

Onde a saída é os primeiros 6 caracteres do md5sum do 'olá'.

Como faço para isso?

    
por Pureferret 04.10.2018 / 12:35

2 respostas

5

A substituição de parâmetros não funciona assim, pelo menos não no bash. Você precisa de uma variável real (parâmetro) e operar diretamente nela. Então, por exemplo, assim:

var=$(echo abcdefgh | cmd1 | cmd2 | ... )
var2="${var:2:4}"

A exceção é zsh , onde você pode converter a substituição de comandos para o parâmetro "on the fly" e fazer isso acima em uma linha:

var2=${"$(echo abcdefgh | cdm1 | cmd2 | ... )":2:4}
    
por 04.10.2018 / 12:58
4

Observe que:

echo $greeting | md5sum

Ou de maneira mais confiável:

printf '%s\n' "$greeting" | md5sum

Não fornece o hash MD5 do conteúdo da variável, mas o conteúdo da variável seguido por um caractere de nova linha. Para o hash MD5 do conteúdo da variável:

printf %s "$greeting" | md5sum

Para os primeiros 6 bytes, com algumas implementações head :

printf %s "$greeting" | md5sum | head -c 6

ou mais portably:

printf %s "$greeting" | md5sum | dd bs=1 count=6 2> /dev/null
    
por 04.10.2018 / 13:28