2010-10-18 106 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