
Bash文書に明確に記載されているようにシェル算術0
、算術拡張式の数字の前に(例えば、$(( expr ))
)は8進数で処理されます。同様に、ベースの数字にも使用できますb#n
。n
b
しかし、算術に使う基数に関係なく~へ式では、値は常に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! "