Remover "\ r" de ecoar no script bash

3

Aqui está o meu script que recebe uma variável do php:

STRING1="/opt/lampp/htdocs/dev/img/$VAR1"
mv $STRING1 "/opt/lampp/htdocs/dev/newlocation/"

Por algum motivo, coloca "\ r" no final de $ STRING1 e não consegue encontrar o ficheiro porque será algo da forma "my_picture.jpg \ r"

Qualquer ajuda é apreciada!

    
por user1062058 18.10.2012 / 00:11

3 respostas

5

O Bash espera que o fim de linha em um script seja sempre e somente um caractere de nova linha (\ n), no estilo Unix, não uma combinação de retorno de linha de carro (\ r \ n) como você normalmente vê no Windows. Bash acha que o caractere \ r é apenas um caractere comum no final da string. (Os caracteres que seguem uma string entre aspas são apenas concatenados no final.)

Como Ignacio sugere, a solução é consertar seu script para eliminar os caracteres. dos2unix é um caminho. Outra seria usar tr -d '\r' < infile > outfile como filtro.

    
por 18.10.2012 / 00:46
4

Passe o script em dos2unix para corrigir as novas linhas.

    
por 18.10.2012 / 00:16
0

Isto é obviamente para o propósito de outros googlers como eu, não o OP, visto que tem mais de 5 anos. Mas essa solução existia na época também.

Você pode tentar uma substituição bash para remover o maior padrão do final da string que se parece com $ {varname %% pattern}, mais aqui:

link

Deve ser mais rápido do que gerar outro processo como o tr para lidar com isso.

VARNAME=$'a_bad_filename\r' VARNAME="${VARNAME%%[[:cntrl:]]}"

Aqui está uma referência para a correspondência de padrões bash severamente limitada ( não é realmente expressão regular, mais de uma expressão 'like' ou 'glob'). Quanto ao motivo pelo qual o retorno de carro está na classe de controle e não na classe de espaço em branco, não tenho certeza. É considerado espaço em branco em outras línguas. Sem ativar a correspondência estendida de padrões por meio de um "extglob shopt -s", não há como especificar uma construção simples como "este caractere repetido 0 ou mais vezes" no bash. Eu também encontrei

printf "%q" "${VARNAME}"

.. além de "set -vx" para mostrar / testar o retorno de carro.

Eu me deparei com esse problema ao usar o cygwin bash contra a saída da versão padrão (não-cygwin) do python; Estou confuso sobre por que não estou vendo mais sobre como resolvê-lo.

    
por 04.06.2017 / 20:01

Tags