Bash脚本创建权限文件时文件名与权限不匹配问题求助
问题原因
你的代码核心问题是把权限的显示格式字符串(比如-w-)直接传给了chmod的符号模式参数,而chmod无法正确解析这种包含-的写法。
在chmod的符号权限语法中,u=xxx里的xxx只能是r/w/x这类代表权限的字符,不能用-占位(-在符号模式里是用来移除权限的操作符,不是权限位的占位符)。比如你想设置用户权限为“仅写”(对应显示格式-w-),正确的写法是u=w,而不是u=-w-——后者会被chmod解析错误,导致实际设置的权限和预期不符。
另外,代码没有提前创建task5目录,如果是第一次运行,会导致大量文件创建失败,也会出现“文件名不存在/权限不匹配”的情况。
修正后的代码
# 先确保目标目录存在 mkdir -p task5 # 权限显示格式数组 p=( --- --x -w- -wx r-- r-x rw- rwx ) for u in "${p[@]}"; do for g in "${p[@]}"; do for o in "${p[@]}"; do f="task5/$u$g$o.txt" # 把权限显示格式转换为chmod能识别的符号模式(去掉所有'-') chmod_str="u=${u//-/},g=${g//-/},o=${o//-/}" touch -- "$f" && chmod "$chmod_str" -- "$f" done done done
关键修改说明
- 添加
mkdir -p task5:确保目标目录存在,避免touch因为找不到目录而失败。 - 转换权限字符串:用
${u//-/}去掉权限显示格式中的所有-,把---转换成空(代表清除所有权限)、-w-转换成w、r-x转换成rx等,让chmod能正确解析权限设置。 - 拆分变量:把
chmod的参数单独存为chmod_str,让代码更清晰,也方便排查问题。
运行修正后的代码后,每个文件的文件名(权限显示格式)和实际设置的权限就能完全匹配了。
内容的提问来源于stack exchange,提问作者Kirill Afanasev
相关产品推荐
相关产品推荐

