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%