更改权限

更改权限

我正在练习并尝试:

1)创建具有所有组合名称或r、w、x权限= 512个文件的文件;

2)更改该文件的权限以匹配名称

我创建了这个脚本:

touch ./{r,-}{w,-}{x,-},{r,-}{w,-}{x,-},{r,-}{w,-}{x,-}

for i in *
   do
       syntax="${i//:}"
       u=${syntax:0:3}
       g=${syntax:3:3}
       o=${syntax:6:3}

       chmod u="$u",g="$g",o="$o" -- "$i" 
  done

它更改了一些权限以匹配名称,但并非全部都是我做错了什么?

答案1

有一些错误。首先,您要创建文件,每组三个文件之间用逗号分隔:

touch ./{r,-}{w,-}{x,-},{r,-}{w,-}{x,-},{r,-}{w,-}{x,-}

但接下来你要删除冒号。冒号应该是逗号。

syntax="${i//:}"

如果脚本位于同一目录中,这可能会导致问题:

for i in *

当然,如果你像../myscript这样运行它,那就没有问题。但如果脚本位于同一目录中,这将避免它:

for i in ???????????

(当然,假设您没有为其指定 11 个字符的名称。)

最后是大bug。您将文件名拆分为三个字符串,例如u='-w-' g='r-x' o='-wx'.这些是 ; 的错误语法 chmod。您需要先删除连字符。所以,分裂之后:

u=${u//-}
g=${g//-}
o=${o//-}

经过所有这些改变,我们得到了这个有效的结果:

touch ./{r,-}{w,-}{x,-},{r,-}{w,-}{x,-},{r,-}{w,-}{x,-}

for i in ???????????
    do
        syntax="${i//,}"
        u=${syntax:0:3}
        g=${syntax:3:3}
        o=${syntax:6:3}
        u=${u//-}
        g=${g//-}
        o=${o//-}

        chmod u="$u",g="$g",o="$o" -- "$i" 
    done

答案2

你的解析有一个字母错误。在语法变量的解析中,您将得到字符串 '--r,--r,--r': u='--r' g=',--' o='r,-'

您应该将脚本更改为:

   u=${syntax:0:3}
   g=${syntax:4:3}
   o=${syntax:8:3}

还有一个提示,要调试 shell 脚本,请尝试在解释器行中添加“-x”。即 '#!/bin/bash -x' 会给你很多很棒的调试输出:)

相关内容