2010-10-18 159 views
0

以下为源代码,其取入只有“文件”,将一个文件的文件的权限和通过更换逻辑错误(UNIX)

R = READ打印输出,瓦特-write,X可执行。

还应回声“用户”。但在这里我的问题是,我已经取代了“-”的用户,但这时如果文件中有R的许可 - X,它也版画“用户“@这一点。我知道它不是一个正确的方式去解决它。任何人都可以给我一个更好的方式来回应”用户“。

我自己也尝试循环之前进行打印,但那么它不会成为我的目的,因为我的程序只适用一个FILE的枝条文件权限,而不是任何块/插座/管/目录/ etc

#!/bin/bash 

    if [ $# -lt 1 ];then 
     echo "USAGE: $0 file-name" 
     exit 1 
    fi 


    ls -l $1 | cut -c1-4 | tr "\012" "." > fp 


    i=1 

    while(($i <= 4)) 
    do 
     p=`cat fp | cut -c$i` 

     case $p in 

     [dbsplc] | t) echo "not a file"; 
      exit 1;; 
     -) echo "User";; 
     r) echo "READ";; 
     w) echo "WRITE";; 
     x) echo "EXECUTE";; 

     esac 

     ((++i)) 
    done 


    exit 0 
+0

应该何时输出“用户” ?只是当它是一个普通的文件? – 2010-10-18 19:41:53

回答

0

此担任我的目的,我分离的首要条件到不同的case语句:

#!/bin/bash 

if [ $# -lt 1 ];then 
    echo "USAGE: $0 file-name" 
    exit 1 
fi 


ls -l $1 | cut -c1-4 | tr "\012" "." > fp 


i=1 
while(($i == 1)) 
do 
    p=`cat fp | cut -c$i` 

    case $p in 

    [dbsplc] | t) echo "not a file"; 
     exit 1;; 
esac 

    echo "User" 
    ((++i)) 
done 



while(($i <= 4)) 
do 
    p=`cat fp | cut -c$i` 

    case $p in 
    r) echo "READ";; 
    w) echo "WRITE";; 
    x) echo "EXECUTE";; 

    esac 

    ((++i)) 
done 


exit 0 
+1

绝对没有理由使用第一个“while” - 它总是要执行且只有一次。第二个'while'应该是'for'循环代替:'为我在{2..4}'中。没有必要使用'cat'。事实上,临时文件和所有外部实用程序也是不必要的,因为您可以将数据保存到变量中,并使用Bash的子字符串解析来挑选出单个字符'$ {var:i:1}'。然而,格兰杰克曼的答案是要走的路。 – 2010-10-26 00:48:26

+0

@丹尼斯威廉姆森 - 好吧,我是新手。所以我做了我认为很简单的理解。我一定会尝试格伦杰克曼的方法。 – Pavitar 2010-10-26 04:42:08

1

我只是使用stat -c %a并代之以处理。

+0

只要注意stat是不可移植的(BSD没有它,我认为) – Daenyth 2010-10-18 18:40:09

+0

你可以更精确一点。我是新手,谢谢。 – Pavitar 2010-10-18 18:40:18

+0

@Pavitar:先试试自己,然后*提出进一步的问题。 – 2010-10-18 18:41:07

0

用awk(容易适应你的程序)

ll |awk '{ 
      rights=substr($1, 2, 3); 
      sub(/r/, "READ ", rights); 
      sub(/w/, "WRITE ", rights); 
      sub(/x/, "EXECUTE ", rights); 
      print rights $3 
      }' 

说明的为例:

rights=substr($1, 2, 3); 

$ 1包含了你的程序的权利,我们只需要3个第一权(用户之一)

sub(/r/, "READ ", rights); 

带有READ in权限的基座“r”(依此类推)。

print rights $3 

打印权限(代替)和包含用户名称的$ 3。

4

太复杂了。你不必依靠ls可言:

#!/bin/bash 

if [[ $# -lt 1 ]]; then 
    echo "USAGE: $(basename "$0") filename ..." 
    exit 1 
fi 

exit_status=0 

for file in "[email protected]"; do 
    if [[ ! -f "$file" ]]; then 
     echo "not a file: $file" >&2 
     exit_status=$((exit_status + 1)) 
     continue 
    fi 

    echo "$file:" 
    echo "User" 

    [[ -r "$file" ]] && echo "READ" 
    [[ -w "$file" ]] && echo "WRITE" 
    [[ -x "$file" ]] && echo "EXECUTE" 
done 

exit $exit_status