Логическая ошибка в скрипте Shell. Пожалуйста, помогите (UNIX) - PullRequest
0 голосов
/ 18 октября 2010

Ниже приведен исходный код, который принимает только «файлы», перечисляет права доступа к файлу для файла и печатает выходные данные, заменяя

r = READ, w-WRITE, x-EXECUTABLE.

Также должно отображаться " Пользователь ". Но моя проблема здесь в том, что я заменил ' - ' на Пользователь, но тогда, если файл имеетразрешение r - x, он также печатает «Пользователь» @ в этот момент. Я знаю, что это неправильный способ сделать это. Может кто-нибудь предложить мне лучший способ повторить «Пользователь».

Iтакже пытался распечатать его перед циклом, но тогда он не будет служить моей цели, так как моя программа работает только с разрешениями файла FILE , а не с любым блоком / сокетом / каналом /каталог / и т.д. .

   #!/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

Ответы [ 4 ]

4 голосов
/ 18 октября 2010

Слишком сложно.Вам вовсе не нужно полагаться на ls:

#!/bin/bash

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

exit_status=0

for file in "$@"; 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
1 голос
/ 18 октября 2010

Я бы просто использовал stat -c %a и обработал бы его вместо этого.

0 голосов
/ 19 октября 2010

Это послужило моей цели, я разделил первое условие на другое case-state.

#!/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
0 голосов
/ 18 октября 2010

пример использования 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);

Вещество "r" с правами READ (и т. д.).

print rights $3

Права на печать (с заменой) и $ 3 с именем пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...