Do Non utilizzare eval
! Presenta il rischio maggiore di introdurre l'esecuzione di codice arbitrario.
BashFAQ-50 - Sto cercando di inserire un comando in una variabile, ma i casi complessi falliscono sempre.
Mettetela in un array e ampliare tutte le parole con doppi apici "${arr[@]}"
per non lasciare che la IFS
scissione le parole a causa della scissione Word .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
e vedere il contenuto dell'array all'interno. Il declare -p
ti permette di vedere il contenuto dell'array all'interno di ogni parametro di comando in indici separati. Se uno di questi argomenti contiene spazi, la citazione all'interno durante l'aggiunta all'array impedirà che venga diviso a causa della divisione delle parole.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
ed eseguire i comandi come
"${cmdArgs[@]}"
23:15:18
(o) usa completamente una bash
funzione per eseguire il comando,
cmd() {
date '+%H:%M:%S'
}
e chiama semplicemente la funzione
cmd
POSIX sh
non ha array, quindi il più vicino possibile è creare un elenco di elementi nei parametri posizionali. Ecco un sh
modo POSIX per eseguire un programma di posta
# 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" "$@"
}
Nota che questo approccio può gestire solo comandi semplici senza reindirizzamenti. Non può gestire reindirizzamenti, pipeline, cicli for / while, istruzioni if, ecc
Un altro caso d'uso comune è durante l'esecuzione curl
con più campi di intestazione e payload. Puoi sempre definire argomenti come di seguito e invocare curl
il contenuto dell'array espanso
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Un altro esempio,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
ora che le variabili sono definite, utilizzare un array per memorizzare gli argomenti del comando
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
e ora esegui una corretta espansione citata
curl "${curlCMD[@]}"