¡No lo use eval! Tiene un gran riesgo de introducir ejecución de código arbitrario.
BashFAQ-50 : estoy tratando de poner un comando en una variable, pero los casos complejos siempre fallan.
Colóquelo en una matriz y expanda todas las palabras con comillas dobles "${arr[@]}"para no permitir que IFSlas palabras se dividan debido a la división de palabras .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
y ver el contenido de la matriz en su interior. Le declare -ppermite ver el contenido de la matriz dentro con cada parámetro de comando en índices separados. Si uno de esos argumentos contiene espacios, citar adentro mientras se agrega a la matriz evitará que se divida debido a la división de palabras.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
y ejecutar los comandos como
"${cmdArgs[@]}"
23:15:18
(o) usar una bashfunción para ejecutar el comando,
cmd() {
date '+%H:%M:%S'
}
y llamar a la función como
cmd
POSIX shno tiene matrices, por lo que lo más cerca que puede acercarse es crear una lista de elementos en los parámetros posicionales. Aquí hay una shforma POSIX de ejecutar un programa de correo
# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
subject=$1
shift
first=1
for addr; do
if [ "$first" = 1 ]; then set --; first=0; fi
set -- "$@" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "$@"
}
Tenga en cuenta que este enfoque solo puede manejar comandos simples sin redirecciones. No puede manejar redirecciones, canalizaciones, bucles for / while, declaraciones if, etc.
Otro caso de uso común es cuando se ejecuta curlcon múltiples campos de encabezado y carga útil. Siempre puede definir argumentos como a continuación e invocar curlen el contenido de la matriz expandida
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Otro ejemplo,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
ahora que las variables están definidas, use una matriz para almacenar sus argumentos de comando
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
y ahora haz una expansión cotizada adecuada
curl "${curlCMD[@]}"