Shell 脚本拆分连接并重新使用

Shell Script split concatenate and re-use

在 Shell 脚本中,我想实现如下内容:

str="india,uk,us,uae"

我想拆分它并按如下方式连接每个项目并分配给某个变量

newstr = '-myParam="india" -myParam="uk" -myParam="us" -myParam="uae"'

这样我就可以在下一个命令中使用上面的连接字符串,如下所示

curl "admin/admin" "localhost" $newstr.

我找到了一种使用本地 IFS 和 for 循环的方法,但在循环内更新的变量不会在循环外保留值,因为它在单独的 bash 中运行。

将参数读入数组:

IFS=, read -a params <<< "$str"

然后遍历它们并将命令存储在数组中:

for i in "${params[@]}"; do
   command+=(-myparam=\"$i\")
done

现在您可以使用 printf "${command[@]}" 扩展它:

$ printf "%s " "${command[@]}"
-myparam="india" -myparam="uk" -myparam="us" -myparam="uae"

也就是说,现在你要说:

curl "admin/admin" "localhost" "${command[@]}"

这是基于 chepner 的回答:

下面的代码可以:

$ str="india,uk,us,uae"
$ newstr=$(awk 'BEGIN{RS=","}{printf "-myParam=\"%s\" ",}' <<<"$str")
$ echo "$newstr"
-myParam="india" -myParam="uk" -myParam="us" -myParam="uae" 

此外,当您将新字符串作为参数传递给 curl 时,请将其双引号以防止分词和通配,这样做:

curl "admin/admin" "localhost" "$newstr"

注意: <<< 或 herestring 仅在少数 shells(Bash、ksh 或 zsh)中受支持,如果我正确回忆。如果您的 shell 不支持它,请使用 echo,pipe 组合。

str="india,uk,us,uae"
var=-myparam=\"${str//,/\" -myparam=\"}\"
echo $var
IFS=',' read -ra a <<< "${str//,/\",}";
curl "admin/admin" "localhost" "${a[@]/#/ -myParam=\"}\""

解释:

开始于:

str="india,uk,us,uae";

接下来,将字符串拆分成一个数组,使用参数替换在每个逗号前插入"

IFS=',' read -ra a <<< "${str//,/\",}";

最后我们可以通过参数替换得到newstr(同时还要追加最后的"):

newstr="${a[@]/#/ -myParam=\"}\"";

newstr 现在设置为 '-myParam="india" -myParam="uk" -myParam="us" -myParam="uae"'。我们可以跳过上一步,直接进入:

curl "admin/admin" "localhost" "${a[@]/#/ -myParam=\"}\""