Czy nie używać eval
! Istnieje duże ryzyko wprowadzenia dowolnego kodu.
BashFAQ-50 - próbuję umieścić polecenie w zmiennej, ale złożone przypadki zawsze zawodzą.
Umieścić go w tablicy i rozwinąć wszystkie słowa z cudzysłowami "${arr[@]}"
aby nie pozwól IFS
rozdzielić słowa ze względu na podział na słowa .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
i zobacz zawartość tablicy w środku. declare -p
Pozwala zobaczyć zawartość wewnątrz tablicy z każdego parametru poleceń w osobnych indeksów. Jeśli jeden z takich argumentów zawiera spacje, cytowanie wewnątrz podczas dodawania do tablicy zapobiegnie jej podzieleniu z powodu podziału na słowa.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
i wykonaj polecenia jako
"${cmdArgs[@]}"
23:15:18
(lub) całkowicie użyj bash
funkcji do uruchomienia polecenia,
cmd() {
date '+%H:%M:%S'
}
i wywołaj funkcję jako sprawiedliwą
cmd
POSIX sh
nie ma tablic, więc najbliższe możliwe jest utworzenie listy elementów w parametrach pozycyjnych. Oto sh
sposób POSIX-a na uruchomienie programu pocztowego
# 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" "$@"
}
Zauważ, że to podejście może obsługiwać tylko proste polecenia bez przekierowań. Nie obsługuje przekierowań, potoków, pętli for / while, instrukcji if itp
Innym częstym przypadkiem użycia jest praca curl
z wieloma polami nagłówka i ładunkiem. Zawsze możesz zdefiniować argumenty jak poniżej i wywołać curl
na rozszerzonej zawartości tablicy
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Inny przykład,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
Teraz, gdy zmienne są zdefiniowane, użyj tablicy do przechowywania argumentów poleceń
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
a teraz wykonaj poprawnie cytowane rozszerzenie
curl "${curlCMD[@]}"