Combinando if / else com variáveis no comando find no script bash

0

Estou escrevendo um script que solicita entradas do usuário e, em seguida, executa um comando de localização.

O que tenho funciona, mas parece que tenho muito código duplicado devido à estrutura if / else. É possível ter a declaração if inline?

Então, em vez desse tipo de coisa:

if [[ $depth_boolean == y ]] || [[ $depth_boolean == yes ]]
    then
        if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
        then
            find -L $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
        else
            find $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
        fi
    else
        if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
        then
            find -L $location -readable -iname "$query" -$find_type $find_type_option -$find_action
        else
            find $location -readable -iname "$query" -$find_type $find_type_option -$find_action
        fi
    fi

É possível fazer algo assim?

find if [ $symlink_boolean == y ]; then echo "-L";
   fi $location if [ $symlink_boolean == y ]; then 
   echo "-maxdepth $depth"; fi -readable -iname "$query" 
   -$find_type $find_type_option -$find_action

O acima não funciona, mas imaginando se é possível?

    
por kerrin 18.11.2018 / 10:17

1 resposta

2

Você pode lidar com o link simbólico com uma variável simples:

symlink_flag=
if [[ $symlink_boolean == y ]]; then
    symlink_flag=-L
fi
find $symlink_flag "$location" -maxdepth "$depth" -readable ...

Observe que $symlink_flag não está listado aqui, portanto, se estiver vazio, ele desaparecerá. O valor que ele contém não contém nenhum caractere curinga ou caractere IFS padrão, portanto, não citá-lo não causa nenhum dano. As outras variáveis devem ser citadas, desde, e. o local pode conter espaços em branco.

Para a parte de profundidade, sua melhor aposta é construir a linha de comando em uma matriz:

arguments=()
if [[ $symlink_boolean == y ]]; then
    arguments+=(-L)
fi
arguments+=("$location")
if [[ $depth_boolean == y ]]; then
    arguments+=(-maxdepth "$depth")
fi
find "${arguments[@]}" -readable -iname ...

Você pode colocar as opções nonchanging na linha de comando find como acima, ou apenas anexá-las incondicionalmente à matriz e apenas executar find "${arguments[@]}" .

Veja também:

Tecnicamente, você também pode fazer o que você propõe com a substituição de comandos:

find $(if [[ $symlink_boolean == y ]]; then printf %s -L; fi) "$location"
    $(if [[ $depth_boolean == y ]]; then echo -maxdepth $maxdepth; fi) ...

Embora, em geral, isso não seja ideal, a única maneira de produzir várias palavras a partir da substituição de comando é separá-las e dividi-las, mas isso não funciona bem se houver palavras dentro que contenham espaços em branco . -maxdepth N deve funcionar, no entanto.

Como nota lateral, você pode condensar um pouco as condições usando, por exemplo, %código%. Verificaria se a variável começa com [[ $symlink_boolean == [Yy]* ]] ou Y . (Se você não se importa com coisas como y também sendo valores verdadeiros.) Use a correspondência de regex YEAAHHH ou [[ $symlink_boolean =~ ^(y|yes)$ ]] para permitir apenas os dois valores.

    
por 18.11.2018 / 10:36

Tags