Bash의 산술 확장에서 8진수를 어떻게 반환합니까?

Bash의 산술 확장에서 8진수를 어떻게 반환합니까?

Bash 문서에 명확하게 설명되어 있듯이쉘 산술0, 산술 확장 표현식 내에서 숫자 앞에 a를 붙이는 경우 (예를 들어, $(( expr ))), 8진수로 처리됩니다. 마찬가지로 base 의 b#n숫자에도 사용할 수 있습니다 .nb

그러나 산술에 사용하는 밑수에 관계없이내부에표현식에서 값은 항상 밑수 10으로 반환됩니다. 어떻게 해야 합니까?반품산술 확장의 결과에서 8진수가 나오나요?

~/.my.cnf이에 대한 나의 원래 사용 사례 는 파일의 권한 비트를 비트마스크와 함께 AND하여 권한이 너무 느슨함(그룹 또는 전체 읽기 가능)을 사용자에게 경고하는 것이었지만 나중에 출력 테스트는 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! "

관련 정보