Shell Script (Bash): Omite caracteres especiais [duplicados]

0

Eu tenho um script de shell que executa um arquivo jar e armazena a saída gerada pela execução do arquivo jar para uma variável.

Por exemplo:

myvariable=$(java -jar MyJavaJarFile.jar)

No entanto, a saída quando executo a instrução java fornecida abaixo consiste em caracteres especiais, como /, \, +, =, etc. Mas, quando ela é armazenada na variável, caracteres como \ são omitidos da variável.

java -jar MyJavaJarFile.jar

Se a saída real for abc=\=abc , a variável armazena apenas abc==abc .

Alguém poderia me ajudar com isso? Obrigado ..:)

    
por Abraham Jaison 27.09.2016 / 10:22

2 respostas

1

A substituição de comandos ( $(cmd) ou 'cmd' (também ${ cmd;} in ksh93)) armazena a saída padrão de cmd menos os caracteres de nova linha à direita (a menos que essa saída contenha bytes NUL em shells diferentes de zsh ) .

Não faz nada de especial com a barra invertida. Os únicos caracteres que podem ser confundidos são o caractere NUL (e todos os caracteres após a primeira ocorrência de NUL em alguns shells) e os caracteres iniciais de nova linha.

var=$(printf '%s\n\n\n' 'foo\bar\baz')

Armazenará foo\bar\baz em $var .

Se você não vir essas barras invertidas em $var , isso pode ser porque você não verificou se elas estão lá corretamente, como usando uma implementação echo ou print que interpreta sequências de escape de barra invertida. / p>

Por exemplo, no modo de conformidade com o UNIX, bash ' echo dá:

bash-4.3$ echo "$var"
foar\baz

(o \b foi expandido para um caractere backspace que, quando enviado para um terminal, faz com que ele retroceda um caractere).

Você deseja usar printf para gerar dados arbitrários (e não se esqueça de citar suas variáveis):

bash-4.3$ printf '%s\n' "$var"
foo\bar\baz

E quando a saída vai para um terminal, você pode querer pós-processá-lo com sed -n l , para que caracteres de controle ou caracteres de espaço à direita, por exemplo, se tornem visíveis.

Ou é porque essas barras invertidas não foram impressas no stdout. Por exemplo:

foo() {
  printf foo
  printf '\' >&2
  printf 'bar\n'
}

Ao executar essa função:

bash-4.3$ foo
foo\bar
bash-4.3$ var=$(foo)
\bash-4.3$ printf '%s\n' "$var"
foobar

O \ não chegou a $var de saída para stderr.

Ou é claro, pode ser porque eles não são produzidos como o comentário sugerido por Benjo, mas isso seria um problema em seu aplicativo java, não em bash .

    
por 27.09.2016 / 10:40
0

Tente

myvariable="$(java -jar MyJavaJarFile.jar)"

E deve armazená-lo como uma string que deve mostrar o "\" também

    
por 27.09.2016 / 10:33