Você tem uma variável CMD
cujo valor é a string $CMD_AIX
e o valor da variável CMD_AIX
é a string (o='host "myhost" ')
. Você quer interpretar o valor de CMD_AIX
como um comando shell e executá-lo.
Para executar o valor de CMD_AIX
como um comando shell, você precisa construir um comando shell que faça isso. É para isso que eval
:
eval "$CMD_AIX"
Este comando, por sua vez, é construído dinamicamente. Então você precisa executá-lo com eval
:
dispatcher=…
eval "$dispatcher"
Dada a forma como o comando interno é construído, obtemos
dispatcher="eval \"\$CMD_$OS\""
eval "$dispatcher"
Ou cortar uma variável:
eval "eval \"\$CMD_$OS\""
Observe que o comando (o='host "myhost" ')
é inútil: atribui a saída de host
à variável o
em uma subshell; o valor não é disponibilizado fora da subcamada. Remova os parênteses. Além disso, host \"$host\"
é estranho: você está colocando o valor da variável host
entre aspas duplas; Não importa, pois os nomes de host não contêm caracteres especiais de shell, mas para usar o valor da variável ao avaliar o snippet de shell, você deve deixar host
unexpanded aqui.
#!/bin/sh
OS=AIX # should probably be OS='uname -r'
host=myhost
CMD_AIX="o=\'host \"\$host\"\'"
eval "eval \"\$CMD_$OS\""
Se você tiver ksh93 ou bash ≥ 4.0, você poderá simplificar esse script usando matrizes associativas. Em vez de preencher o código para cada sistema operacional em uma variável diferente, coloque-os em uma matriz associativa .
#!/usr/bin/env bash
typeset -A commands
commands[AIX]="o=\'host \"\$host\"\'"
OS=AIX
host=myhost
if [ -n "${commands[$OS]}" ]; then
eval "${commands[$OS]}"
else
echo >&2 "Operating system $OS not supported"
exit 2
fi