Bash 산술 확장에서 8진수를 반환하는 방법은 무엇입니까?

Bash 산술 확장에서 8진수를 반환하는 방법은 무엇입니까?

Bash 문서에 명확하게 명시된 바와 같이쉘 산술0, 산술 확장 표현식의 숫자 앞에 (예를 들어, $(( expr )))은 8진수로 처리됩니다. 마찬가지로 base 의 숫자에도 사용할 수 있습니다 b#n.nb

그러나 산술에 사용하는 기수에 관계없이~에표현식에서 값은 항상 10진법으로 반환됩니다. 나는 무엇을 해야 합니까?반품산술 확장 결과를 8진수로 표현합니까?

나의 초기 사용 사례는 파일의 권한 비트를 비트마스크와 AND로 연결하여 사용자의 권한이 너무 허용적(그룹 읽기 가능 또는 누구나 읽을 수 있음)임을 사용자에게 경고하는 것이었지만 ~/.my.cnf나중에 테스트 결과가 find ~/.my.cnf -perm +0044잠재적으로 더 깨끗하고 이식 가능하다고 결정했습니다. stat형식 문자열은 macOS/BSD와 Linux 사이에서 표준이 아니기 때문입니다 . 그러나 문제는 남아 있습니다.

답변1

댓글에서 우연히 발견한 정보입니다.또 다른 SE 스레드: (8진수) 형식 문자열 printf에만 사용할 수 있습니다 .%o

실제 예:

# figure out stat(1) flags based on OS
if [[ $(uname -s) == Linux ]]; then PERMS='-c %a' else PERMS='-f %Lp'; fi

stat $PERMS ~/.my.cnf
# result: 600 (not group/world readable)

# permission bits if group/world readable
bitmask=044
perm=$(stat $PERMS ~/.my.cnf)
printf "%o\n" $(( 0$perm & 0$bitmask ))
# result: 0

# now make the file group-readable and try again
chmod 640 ~/.my.cnf
perm=$(stat $PERMS ~/.my.cnf)
printf "%o\n" $(( 0$perm & 0$bitmask ))
# result: 40

보너스: 기타 솔루션

내가 원하지 않으면바라보다8진수 권한 비트는 printf원래 목표를 달성하기 위해 전혀 사용할 필요가 없었습니다. 내가 신경 쓴다면어느비트를 설정하면 bitmask결과가 0이 아닌지 테스트하는 것으로 충분합니다.

if (( 0$perm & 0$bitmask )); then
    echo "Permissions $perm are too lax." >&2
fi

있는지 알고 싶다면모두다음과 같이 비트를 설정한 bitmask다음 비트 마스크를 사용하여 AND 연산의 결과와 비교합니다.

(( (0777 & 0066) == 0066 )) && echo "Oh noes, group AND world writable! "

관련 정보