Bash算術拡張から8進数を返す方法は?

Bash算術拡張から8進数を返す方法は?

Bash文書に明確に記載されているようにシェル算術0、算術拡張式の数字の前に(例えば$(( expr )))は8進数で処理されます。同様に、ベースの数字にも使用できますb#nnb

しかし、算術に使う基数に関係なく~へ式では、値は常に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結果がゼロでないことをテストするだけで十分です。

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! "

おすすめ記事