¡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 IFS
las 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 -p
permite 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 bash
función para ejecutar el comando,
cmd() {
date '+%H:%M:%S'
}
y llamar a la función como
cmd
POSIX sh
no 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 sh
forma 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 curl
con múltiples campos de encabezado y carga útil. Siempre puede definir argumentos como a continuación e invocar curl
en 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[@]}"