ทำไม่ได้ใช้eval
! มีความเสี่ยงอย่างมากในการแนะนำการใช้รหัสโดยอำเภอใจ
ทุบตี - ฉันพยายามใส่คำสั่งในตัวแปร แต่กรณีที่ซับซ้อนมักจะล้มเหลวเสมอ
วางไว้ในอาร์เรย์และขยายคำทั้งหมดที่มีราคาสองครั้ง"${arr[@]}"
เพื่อไม่ให้IFS
แยกคำที่เกิดจากการแยกโปรแกรม Word
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
และดูเนื้อหาของอาร์เรย์ภายใน declare -p
ช่วยให้คุณดูเนื้อหาของภายในอาร์เรย์กับแต่ละพารามิเตอร์คำสั่งในดัชนีแยกต่างหาก หากอาร์กิวเมนต์ดังกล่าวมีช่องว่างการอ้างถึงภายในในขณะที่เพิ่มลงในอาร์เรย์จะป้องกันไม่ให้แยกเนื่องจาก Word-Splitting
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
และดำเนินการคำสั่งเป็น
"${cmdArgs[@]}"
23:15:18
(หรือ) ใช้bash
ฟังก์ชันเพื่อเรียกใช้คำสั่งร่วมกัน
cmd() {
date '+%H:%M:%S'
}
และเรียกใช้ฟังก์ชันเป็นเพียง
cmd
POSIX sh
ไม่มีอาร์เรย์ดังนั้นสิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือการสร้างรายการองค์ประกอบในพารามิเตอร์ตำแหน่ง นี่คือsh
วิธีPOSIX ในการเรียกใช้โปรแกรมเมล
# 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" "$@"
}
โปรดทราบว่าวิธีนี้สามารถจัดการได้เฉพาะคำสั่งธรรมดาที่ไม่มีการเปลี่ยนเส้นทาง ไม่สามารถจัดการการเปลี่ยนเส้นทางไปป์ไลน์สำหรับ / while ลูปคำสั่ง if ฯลฯ
การใช้งานทั่วไปอีกกรณีหนึ่งคือเมื่อรันcurl
กับฟิลด์ส่วนหัวและเพย์โหลดหลายฟิลด์ คุณสามารถกำหนด args ดังต่อไปนี้และเรียกใช้curl
เนื้อหาอาร์เรย์ที่ขยายได้
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
ตัวอย่างอื่น,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
เมื่อกำหนดตัวแปรแล้วให้ใช้อาร์เรย์เพื่อจัดเก็บ args คำสั่งของคุณ
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
และตอนนี้ทำการขยายคำพูดที่เหมาะสม
curl "${curlCMD[@]}"