Bash脚本修改文件权限无效问题排查求助
问题分析与修复方案
核心问题1:命令行参数未传递到权限修改逻辑
你的脚本没有接收并传递命令行传入的g+r/g-r参数:result函数调用changePermissions时没传参,同时脚本也没把命令行参数($1)传递给核心处理函数,导致权限修改逻辑根本不知道要执行哪种操作。
核心问题2:权限判断逻辑错误
mod1和mod2里用[ ! -r $FILE_PATH ]判断的是当前执行脚本的用户是否有读权限,而非文件的组权限状态。比如就算组没有读权限,当前用户如果是文件所有者,-r依然会返回真,导致判断逻辑完全失效。
修复后的完整脚本
#!/bin/bash # 校验输入参数合法性 if [ $# -ne 1 ] || [[ ! "$1" =~ ^g[+-]r$ ]]; then echo "用法: $0 [g+r|g-r]" exit 1 fi FILE_PATH=~/myFile.txt function list() { ls -l "$FILE_PATH" } # 专门检查文件的组读权限状态 function has_group_read() { local perm=$(stat -c "%A" "$FILE_PATH") [[ "${perm:4:1}" == "r" ]] } function mod1() { if ! has_group_read; then chmod g+r "$FILE_PATH" echo "已添加组读权限" else echo "文件已具备组读权限!" fi } function mod2() { if has_group_read; then chmod g-r "$FILE_PATH" echo "已移除组读权限" else echo "文件原本就没有组读权限!" fi } function changePermissions() { if [ "$1" = "g+r" ]; then mod1 elif [ "$1" = "g-r" ]; then mod2 fi } function result() { echo "修改前权限:" list echo "---" changePermissions "$1" echo "---" echo "修改后权限:" list } # 将命令行参数传递给核心处理流程 result "$1"
关键修复说明
- 新增参数校验:确保用户只能传入
g+r或g-r,避免无效输入 - 新增
has_group_read函数:精准判断文件的组读权限状态,替代原有的错误判断逻辑 - 传递命令行参数:将用户输入的参数传递到
changePermissions函数,让权限修改逻辑知道要执行的操作 - 路径加双引号:避免文件路径包含空格时出现错误
- 优化输出:清晰展示修改前后的权限变化
内容的提问来源于stack exchange,提问作者Golden Shadow
相关产品推荐
相关产品推荐

