不要不要使用eval!它存在引入任意代码执行的重大风险。
BashFAQ-50 - 我正在尝试将命令放入变量中,但复杂的情况总是失败。
把它放在一个数组中,把所有带双引号"${arr[@]}"的单词展开成不让IFS分割单词,因为Word Splitting。
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 没有数组,因此最接近的方法是在位置参数中建立元素列表。这是运行邮件程序的 POSIX sh 方式
# 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"'"'
现在变量已经定义好了,使用一个数组来存储你的命令参数
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
现在做一个适当的引用扩展
curl "${curlCMD[@]}"