不要 使用 ! 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
使用多个标头字段和有效负载运行时。您可以像下面这样定义参数,并 curl
在扩展的数组内容上
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
另一个例子,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
现在已经定义了变量,使用数组来存储命令参数
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
现在进行适当的引用扩展
curl "${curlCMD[@]}"