Eu quero obter o número ASCII de um caractere, então tenho o seguinte:
VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM
O que '$
significa neste contexto? Alguém pode me indicar uma documentação para entender a sintaxe? Eu não entendo se é parte de $(...)
ou printf
ou bash
.
'$
não significa nada de especial. Com%d
inprintf
, ele tenta avaliar o argumento como uma expressão inteira.'a
é considerado ochar
a
, ou o inteiro 97. Você obteria o mesmo resultado mesmo se não usasse a expansão de variável:Da documentação do bash em
printf
(ênfase minha):Quaisquer caracteres restantes são ignorados, conforme observado nos comentários.
O
'
é parte do argumento printf (veja a seção Argumentos aqui ).O
$
é parte da expansão regular do shell, então osprintf
argumentos se tornam%d
e'a
.Por fim,
$(...)
construct é Command Substitution , que neste caso significa queNUM
tem seu valor definido para a saída daprintf
função.Como já foi dito, o
'$
não significa nada de especial por si só. Seu"'$VAR"
é expandido para'a
, que será passado como um argumento para oprintf
utilitário.Em seguida, vem a parte interessante - um recurso obscuro, mas padrão
printf
(o utilitário shell, não a função da linguagem C).De acordo com o padrão SuSv4 (ênfase minha):
Se o seu shell suportar caracteres multibyte (como UTF-8, o padrão em qualquer sistema moderno), esse valor numérico será o do caractere completo, não do byte inicial:
Observe que esse não é o "valor ASCII" do caractere - a descrição da página de manual do bash é, na melhor das hipóteses, enganosa.
No entanto, o bash (e a maioria dos outros shells, exceto o yash) não estão em conformidade com o padrão, porque eles realizarão essa tradução mesmo com especificadores float como
f
oug
, o que viola claramente o primeiro parágrafo acima, que diz questrtod()
deve ser usado nesse caso: