Do not kullanmak eval
! Keyfi kod çalıştırma getirme riski büyüktür.
BashFAQ-50 - Bir değişkene bir komut koymaya çalışıyorum, ancak karmaşık durumlar her zaman başarısız oluyor.
Bir dizide koyun ve çift tırnak tüm kelimeleri genişletmek "${arr[@]}"
için değil izin IFS
bölünmüş nedeniyle kelimeleri Kelime Yarma .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
ve içindeki dizinin içeriğini görün. declare -p
Ayrı endeksleri, her komut parametresi dizi iç içeriğini bkz sağlar. Böyle bir bağımsız değişken boşluk içeriyorsa, diziye eklerken içeriden alıntı yapmak, Sözcük Bölme nedeniyle bölünmesini önleyecektir.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
ve komutları şu şekilde yürütün
"${cmdArgs[@]}"
23:15:18
(veya) bash
komutu çalıştırmak için tamamen bir işlev kullanın,
cmd() {
date '+%H:%M:%S'
}
ve işlevi sadece
cmd
POSIX sh
dizisine sahip değildir, bu nedenle en yakın gelebileceğiniz şey, konumsal parametrelerde bir öğe listesi oluşturmaktır. İşte sh
bir posta programını çalıştırmanın POSIX yolu
# 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" "$@"
}
Bu yaklaşımın, yeniden yönlendirme olmaksızın yalnızca basit komutları işleyebileceğini unutmayın. Yönlendirmeleri, ardışık düzenleri, for / while döngülerini, if ifadelerini vb. İşleyemez.
Diğer bir yaygın kullanım durumu, curl
birden çok başlık alanı ve yük ile çalıştırılmasıdır . Her zaman aşağıdaki gibi bağımsız değişkenler tanımlayabilir curl
ve genişletilmiş dizi içeriğine başvurabilirsiniz.
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Başka bir örnek,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
şimdi değişkenler tanımlandığına göre, komut değişkenlerinizi saklamak için bir dizi kullanın
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
ve şimdi uygun şekilde alıntılanmış bir genişletme yapın
curl "${curlCMD[@]}"