千万不能使用eval
!引入任意代码执行的主要风险。
BashFAQ-50-我试图将命令放入变量中,但是复杂的情况总是失败的。
把它放在一个阵列,并展开所有用双引号的话"${arr[@]}"
到没有让IFS
分裂由于单词分词。
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
并查看其中的数组内容。使用declare -p
,您可以在单独的索引中查看每个命令参数内部数组的内容。如果一个这样的参数包含空格,则在添加到数组时在内部加引号将防止其由于单词拆分而被拆分。
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" "$@"
}
请注意,这种方法只能处理没有重定向的简单命令。它无法处理重定向,管道,for / 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[@]}"