Sie nicht verwenden eval
! Es besteht ein großes Risiko, dass eine willkürliche Codeausführung eingeführt wird.
BashFAQ-50 - Ich versuche, einen Befehl in eine Variable einzufügen , aber die komplexen Fälle schlagen immer fehl.
Legen Sie es in einem Array und erweitern , um alle Wörter mit doppelten Anführungszeichen "${arr[@]}"
zu nicht der LET IFS
Spaltung aufgrund der Worte Wort Splitting .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
und sehen Sie den Inhalt des Arrays im Inneren. Mit declare -p
können Sie den Inhalt des Arrays mit jedem Befehlsparameter in separaten Indizes anzeigen. Wenn ein solches Argument Leerzeichen enthält, wird durch Anführungszeichen beim Hinzufügen zum Array verhindert, dass es aufgrund von Word-Splitting aufgeteilt wird.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
und führen Sie die Befehle als aus
"${cmdArgs[@]}"
23:15:18
(oder) insgesamt eine bash
Funktion verwenden, um den Befehl auszuführen,
cmd() {
date '+%H:%M:%S'
}
und rufen Sie die Funktion als gerecht auf
cmd
POSIX sh
hat keine Arrays. Sie können also am ehesten eine Liste von Elementen in den Positionsparametern erstellen. Hier ist eine POSIX- sh
Methode zum Ausführen eines Mail-Programms
# 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" "$@"
}
Beachten Sie, dass dieser Ansatz nur einfache Befehle ohne Umleitungen verarbeiten kann. Es kann keine Umleitungen, Pipelines, for / while-Schleifen, if-Anweisungen usw. Behandeln
Ein weiterer häufiger Anwendungsfall ist die Ausführung curl
mit mehreren Headerfeldern und Nutzdaten. Sie können jederzeit Argumente wie unten definieren und curl
den erweiterten Array-Inhalt aufrufen
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Ein anderes Beispiel,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
Nachdem die Variablen definiert sind, verwenden Sie ein Array, um Ihre Befehlsargumente zu speichern
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
und jetzt machen Sie eine richtig zitierte Erweiterung
curl "${curlCMD[@]}"