Não está totalmente claro para mim o que você está perguntando, mas aqui está um exemplo muito simples que aborda a questão no título (como avaliar uma instrução if gerada dinamicamente no shell):
#!/bin/bash
# eval_dynamic_if_then
# Get a command to test from the user
COMMAND="$*"
# Construct an if-then statement using the user
# supplied command and save it to a variable
read -r -d '' IF_THEN <<HEREDOC
if eval "${COMMAND}"; then
echo "Command successful!"
else
echo "Command NOT successful!"
fi
HEREDOC
# Evaluate the command
eval "${IF_THEN}"
Aqui está um exemplo de invocação deste script:
./eval_dynamic_if_then true
Isso resulta na seguinte saída:
Command successful!
Alternativamente:
./dynamic_if_then false
produz:
Command NOT successful!
Como você também está experimentando com printf
, aqui está uma adaptação que só imprime o comando em vez de avaliá-lo:
#!/bin/bash
# print_dynamic_if_then
# Get a command to test from the user
COMMAND="$*"
# Construct an if-then statement using the user
# supplied command and save it to a variable
read -r -d '' IF_THEN <<HEREDOC
if eval "${COMMAND}"; then
echo "Command successful!"
else
echo "Command NOT successful!"
fi
HEREDOC
# Print the command
printf "${IF_THEN}"
Agora, para avaliar a saída desse script, você faria algo como o seguinte:
eval "$(print_dynamic_if_then true)"
Observe que a substituição é citada, por ex. o seguinte não funciona:
eval $(print_dynamic_if_then true)
Isso resulta na seguinte mensagem de erro:
-bash: syntax error: unexpected end of file
Examinando seu exemplo original, parece que você queria substituir printf
declarações por eval
em locais nos quais a sequência de argumentos passada era apenas um fragmento de código e não uma instrução shell completa. A solução para esse problema específico é gerar toda a instrução a ser executada antes de transmiti-la ao comando eval
.
Também gostaria de fazer eco aos comentários de outros usuários que recomendaram essa abordagem. Se eu fosse você, eu consideraria pensar em uma maneira de alcançar seu objetivo final sem depender do comando eval
.