Como gerar um caractere ascii em uma string com Bash / ZSH corretamente?

2

Estou tentando gerar uma sequência de 10 seguida por NULL ( 10 ) seguida por echo "100" .

No entanto, 10 parece não funcionar (imagino que gere dois caracteres - um 0 seguido por echo "10""/0""10" . Não sei como separar / escapar destes valores / caracteres?

Eu também tentei %code% , que teve o mesmo resultado.

Estou colocando essa saída em um pipe nomeado.

    
por Chris Stryczynski 28.08.2018 / 10:57

2 respostas

1

Em um shell compatível com POSIX, você pode usar:

echo '10
printf '10
echo '10
printf '10%pre%010\n'
0010'
010\n'
0010'

observe que echo requer três números octais para seguir um bash para terminar uma sequência de escape octal.

O problema no seu caso é que XSI não é compatível com POSIX neste caso, pois ele não implementa bash support que é necessário para uma variante UNIX não integrada.

printf no entanto suporta parcialmente %code% e você pode usar:

%pre%     
por 28.08.2018 / 11:08
0

Melhor usar o printf Por que o printf é melhor que o eco? muitas razões:

$ printf '%b' 10 \0 10
1010

Ou printf '%b' 10 'sed l' 10 (e usando od para ver os valores de bytes (ou cat -A ou \n ):

$ printf '%b' 10 '
$ printf '%b' 10 \0 10 '\n' | sed l
10
$ echo -e 10 '
$ echo -e 10 '
$ dash -c 'echo -e 10 \0 10'
-e 10  10
' 10 | tr -d ' ' | od -An -c 1 0
$ echo -e 10 '
$ zsh -c 'echo -e h \00044 h | od -An -tx1c'
  68  20  04  34  20  68  0a
   h     004   4       h  \n
' 10 -e 10
$ zsh -c 'echo -e h \4 h | od -An -tx1c'
  68  20  04  20  68  0a
   h     004       h  \n
10
1 0 \n
' 10 | od -An -c 1 0
$ printf '%b' 10 '' 10 '\n'
10-10
1 0 \n
010$
' 10 | od -An -c 1 0
$ printf '%b' 10 \0 10
1010
1 0

Observe que a string não tem echo (newline) à direita, conforme solicitado.
Se uma nova linha for necessária, use:

$ printf '%b' 10 '
$ printf '%b' 10 \0 10 '\n' | sed l
10
$ echo -e 10 '
$ echo -e 10 '
$ dash -c 'echo -e 10 \0 10'
-e 10  10
' 10 | tr -d ' ' | od -An -c 1 0
$ echo -e 10 '
$ zsh -c 'echo -e h \00044 h | od -An -tx1c'
  68  20  04  34  20  68  0a
   h     004   4       h  \n
' 10 -e 10
$ zsh -c 'echo -e h \4 h | od -An -tx1c'
  68  20  04  20  68  0a
   h     004       h  \n
10
1 0 \n
' 10 | od -An -c 1 0
$ printf '%b' 10 '' 10 '\n'
10-10
1 0 \n
010$
' 10 | od -An -c 1 0 %pre% 1 0

I'm not sure how to separate / escape these values / characters?

A única forma segura de separar os caracteres é colocá-los em argumentos separados.

Mas usar -e é complexo e propenso a falhas, pois há várias versões de eco.

No bash (sua tag na pergunta), echo precisa da opção sed l para fazer com que ela entenda os valores de barra invertida (e para ver os valores de byte use od (ou cat -A ou /bin/echo ):

%pre%

Isso funciona no bash, zsh, ksh e (GNU) -e (pelo menos).

Mas o echo está incluindo um caractere de espaço (caractere ASCII 32 dec (20 em hexadecimal 40 em octal)) que precisa ser removido.

%pre%

E, a opção \b não é interpretada por algumas implementações de eco (como traço):

%pre%

E até mesmo a contrabarra não é interpretada por algum eco:

%pre%

E mesmo que a especificação POSIX defina os números octal de barras invertidas sendo de até três dígitos (que comece com um zero) :

%bl0ck_qu0te%num
Write an 8-bit value that is the zero, one, two, or three-digit octal number num.

%pre%

Menos dígitos também são aceitos:

%pre%

E isso é uma interpretação e, como é habitual, qualquer interpretação é uma fonte de mal-entendidos.

Então, em suma, evite o eco e use printf .

E mesmo se printf também puder interpretar até quatro dígitos octal (com a opção %code% ), não poderá haver interpretações erradas se cada valor for um argumento separado:

%pre%     
por 29.08.2018 / 21:55