Não é possível remover o espaço do início da variável

0

Estou tentando criar uma pasta com o rótulo e o uuid de um dispositivo de mídia conectado como seu nome, em outro flash drive que estou usando para registrar. Eu tenho o seguinte código:

LOGDEVICELABEL=FLASHDRIVENAME
MD='lsblk -I 8 -o label,uuid -n|sed -e '/^$/ d' -e '/^$LOGDEVICELABEL.*$/ d''
MDLOGDIR=/media/$LOGDEVICELABEL/Log/$MD
mkdir $MDLOGDIR

O problema é que o valor da variável $MD tem um espaço no começo do qual não consigo me livrar. Esse espaço faz com que o mkdir trate /media/$LOGDEVICELABEL/Log/ e $MD como dois argumentos separados.

Eu tentei:

MDLOGDIR='sed 's/ // g' <<</media/$LOGDEVICELABEL/Log/$MD' 

Que remove apenas o espaço entre o UUID e o Label (que também é necessário), mas não remove o espaço entre /media/$LOGDEVICELABEL/Log/ e $MD .

    
por novice 04.10.2018 / 17:52

2 respostas

1

Uma coisa que eu vou fazer é usar echo para remover espaços em branco indesejáveis. Neste contexto, é importante omitir quaisquer citações:

LOGDEVICELABEL=FLASHDRIVENAME
MD=$(lsblk -I 8 -o label,uuid -n|sed -e '/^$/ d' -e '/^$LOGDEVICELABEL.*$/ d')
MD=$(echo $MD) # <-- This line
MDLOGDIR=/media/$LOGDEVICELABEL/Log/$MD
mkdir $MDLOGDIR

O shell chama o comando echo e fornece uma série de tokens, e o comando echo imprime esses tokens separados por um caractere de espaço. Isso tem o efeito de (1) pular espaços em branco à esquerda e à direita e (2) converter um ou mais caracteres de espaço em branco entre símbolos para um único espaço.

Meu uso de $(...) em vez da versão de retrocesso neste contexto é equivalente à versão de retrocesso. Geralmente eu acho esta versão mais fácil de ler. Ele também tem o bom benefício que pode ser aninhado ( $(...$(...)) ) onde a versão de retrocesso não pode.

    
por 04.10.2018 / 18:04
0

Por que não usar "expansão de parâmetro" como

MDLOGDIR=/media/$LOGDEVICELABEL/Log/${MD# }
MDLOGDIR=/media/$LOGDEVICELABEL/Log/${MD/ }

ou estenda o sed como

s /^ //
    
por 04.10.2018 / 18:36