Testar variáveis aninhadas em um loop while

0

Eu estava tentando inserir uma variável aninhada como uma condição de loop while, mas não consigo expandi-la corretamente.

print_message() {
    timer=0
    timer_condition="$2"

    while [[ $timer_condition ]]; do
        sleep 1
        timer=$((timer+1))
    done
    echo "$1"
}

print_message 'Hello world, 5 seconds passed...' '$timer != "5"'
print_message 'Hello again, another 10 seconds passed...' '$timer != "10"'

Como exemplo, criei uma função simples print_message que aceita 2 argumentos: $ 1 sendo a mensagem a ser impressa e $ 2 sendo a condição que eu quero que o loop while teste, para que a função possa ser alimentada com diferentes condições para exibir as mensagens . No entanto, o loop while está testando se $ timer_condition em si é verdadeiro, em vez de testar seu conteúdo. Existe uma maneira de fazer funcionar assim?

while [[ $timer != "5" ]]; do

Obrigado

    
por Radvansky 17.11.2017 / 04:46

3 respostas

0

Você pode usar eval :

eval: eval [arg ...]

Execute arguments as a shell command.

Combine ARGs into a single string, use the result as input to the shell, and execute the resulting commands.

Exit Status: Returns exit status of command or success if command is null.

Um exemplo inventado apenas para ilustrar:

foo=bar
expr='[[ $foo == bar ]]'
if eval "$expr"; then
  echo 'foo is equal to "bar"'
fi

Para seu script, passe '[[ $timer != 5 ]]' como seu param e use

while eval "$timer_condition"; do

Esteja ciente, no entanto, de que eval deve ser usado com cuidado , pois é fácil explorá-lo se você não for cuidadoso.

    
por 17.11.2017 / 06:56
1

Aqui está uma maneira de fazer o que você quer fazer:

print_message() {
    timer=0
    timer_condition="$2"

    while (( $timer_condition ))
    do
        sleep 1
        (( timer += 1 ))
    done
    echo "$1"
}

print_message 'Hello world, 5 seconds passed...' 'timer != 5'
print_message 'Hello again, another 10 seconds passed...' 'timer != 10'

~

    
por 17.11.2017 / 07:32
-1

Suponha que você deseje que a condição transmitida seja ls -1 | grep demo , em que demo é um arquivo existente, aqui está um snippet de código que funciona:

print_message() {
    condition="$2"

    if eval "$condition" > /dev/null
    then
        echo "$1"
    fi
}

print_message 'Found' 'ls -1 | grep demo'
    
por 18.11.2017 / 03:38