Como definir primárias de expressões condicionais personalizadas no Bash?

1

Como eu redefiniria e / ou definiria novas expressões primárias condicionais em bash? Por exemplo, eu gostaria de um primário que testa a existência de um diretório vazio. Naturalmente, seria preferível fazer isso com apenas uma primária, mas se isso não for possível, duas primárias também são aceitáveis. Por exemplo, gostaria de poder fazer isso:

    if [ -DZ $HOME/dir ]; # true if directory the path is an empty directory
      then echo "$HOME/dir doesn't have any non-hidden files or directories!"
    fi
    
por Derek Callaway 29.03.2018 / 10:10

1 resposta

3

Para adicionar seus próprios predicados test , você teria que modificar as fontes bash para o comando [ interno. Isso provavelmente não é o que você deseja fazer, pois resultaria em scripts irremediavelmente não portáveis. Você pode usar uma função shell:

isemptydir () (
    shopt -s nullglob
    shopt -s dotglob

    if [ -z "$1" ]; then
        echo 'isemptydir: Empty or missing argument' >&2
        return 1

        # could instead do: set .
        # this would use the current directory as the "default" one
    fi

    if [ -d "$1" ]; then
        # note: above test fails on inaccessible dirs --> "not empty"

        set -- "${1%/}"/*
        [ "$#" -eq 0 ]
        # note: above test succeeds on unlistable dirs --> "empty"           
    fi
)

if isemptydir "$mydir"; then
    printf 'Directory "%s" is empty\n' "$mydir"
else
    printf '"%s" is not a directory, or is not empty\n' "$mydir"
fi

A função testa se o argumento fornecido é o nome de um diretório. Se estiver, ele conta o número de nomes (não apenas arquivos) disponíveis no diretório, incluindo nomes ocultos, e compara isso a zero. O status de retorno do teste que é executado por último é o status de retorno da função.

Você poderia sobrecarregar os comandos [ ou test com suas próprias funções, mas isso também seria potencialmente problemático.

    
por 29.03.2018 / 10:16