【发布时间】:2020-04-26 02:01:09
【问题描述】:
在我的脚本中,我使用简单的一行来标记:
IFS=';' read -ra ALL_ADDR <<< "${SERVER}"
但是,当我在busybox(alpine)linux docker容器中运行此脚本时,它会在上面的行中跌跌撞撞。 line 43: syntax error: unexpected redirection
我理解这是因为脚本不是由Bash 运行的,而是由Ash 运行的,它没有<<< 重定向参数。如何将上面的行转换为在所有流行的 shell 脚本中都可以使用的代码。 (主要是 Bash、Ash 和 Dash)?
为了完整起见,变量如下:
SERVER="/api/v1:127.0.0.1:1337;/api/v2:127.0.0.1:1338"
IFS=';' read -ra ALL_ADDR <<< "${SERVER}"
for i in "${ALL_ADDR[@]}"; do
IFS=':' read -ra ADDR <<< "${i}"
PROXY=${ADDR[0]}
IPADDR=${ADDR[1]}
PORT=${ADDR[2]}
LOC_STRING="${LOC_STRING}\tlocation ${PROXY} {\n\t\tproxy_pass http://${IPADDR}:${PORT}\n\t}\n"
done
LOC_STRING=${LOC_STRING//\//\\\/}
#"insert" above generated lines into a site config for nginx
sed -e "0,/^\s*location/{s/^\s*location/${LOC_STRING}\n&/}" 'portal' > "../sites-enabled/portal"
【问题讨论】:
-
这能回答你的问题吗? Bash: How to tokenize a string variable?
-
该问题中的答案都不是特别安全的,其中一些使用了
ash不支持的数组。 -
您可以使用 here-doc 重定向来获得相同的效果,但重定向问题并不是唯一的:
ash的read不支持-a标志。您可能必须使用while read -r ADDR; do [...]; done <<DELIM; $SERVER; DELIM循环才能达到相同的效果。 -
var 的内容是什么样的?
-
@PaulHodges 我用“用例”更新了这个问题。