Conforme claramente explicado na documentação do Bash sobre aritmética do shell , se você prefixar um número com a 0
dentro de uma expressão de expansão aritmética ( por exemplo , $(( expr ))
), ele será tratado como octal. Da mesma forma, você pode usar b#n
para um número n
em base b
.
No entanto, independentemente da base usada para a aritmética dentro da expressão, o valor é sempre retornado como base 10. Como faço para retornar octal do resultado de uma expansão aritmética?
Meu caso de uso original para isso foi avisar um usuário de que as permissões em seu sistema ~/.my.cnf
eram muito frouxas (legíveis em grupo ou em todo o mundo) juntando os bits de permissão do arquivo com uma máscara de bits, mas depois decidi que testar a saída de find ~/.my.cnf -perm +0044
é provavelmente mais limpo e mais portátil, já stat
que as strings de formato não são padrão entre macOS/BSD e Linux. Ainda assim, a questão permanece.
Aqui está um boato que encontrei em um comentário em outro segmento SE : você pode usar apenas
printf
com a%o
string de formato (octal).Um exemplo de trabalho:
Bônus: outras soluções
Se eu não quiser ver os bits de permissões em octal, posso atingir meu objetivo original sem usar
printf
nada. Se tudo o que me importa é se algum dos bits nobitmask
foi definido, apenas testar se o resultado é diferente de zero é suficiente:Se você quiser saber se todos os bits
bitmask
foram definidos, compare o resultado do AND entre eles com a máscara de bits, algo assim: