Ne pas utiliser eval
! Il présente un risque majeur d'introduire une exécution de code arbitraire.
BashFAQ-50 - J'essaie de mettre une commande dans une variable, mais les cas complexes échouent toujours.
Mettez - le dans un tableau et développer tous les mots avec des guillemets doubles "${arr[@]}"
pour ne pas laisser IFS
diviser les mots en raison de césure de mots .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
et voir le contenu du tableau à l'intérieur. Le declare -p
vous permet de voir le contenu du tableau à l'intérieur avec chaque paramètre de commande dans des index séparés. Si l'un de ces arguments contient des espaces, les guillemets à l'intérieur lors de l'ajout au tableau l'empêcheront de se diviser en raison de Word-Splitting.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
et exécutez les commandes comme
"${cmdArgs[@]}"
23:15:18
(ou) utiliser une bash
fonction pour exécuter la commande,
cmd() {
date '+%H:%M:%S'
}
et appelez la fonction comme juste
cmd
POSIX sh
n'a pas de tableaux, donc le plus proche est de construire une liste d'éléments dans les paramètres de position. Voici une sh
façon POSIX d'exécuter un programme de messagerie
# 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" "$@"
}
Notez que cette approche ne peut gérer que des commandes simples sans redirections. Il ne peut pas gérer les redirections, les pipelines, les boucles for / while, les instructions if, etc.
Un autre cas d'utilisation courant est lors de l'exécution curl
avec plusieurs champs d'en-tête et une charge utile. Vous pouvez toujours définir des arguments comme ci-dessous et les invoquer curl
sur le contenu du tableau étendu
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Un autre exemple,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
maintenant que les variables sont définies, utilisez un tableau pour stocker vos arguments de commande
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
et maintenant faire une expansion citée appropriée
curl "${curlCMD[@]}"