1

在 Shell 脚本中,我想实现如下所示:

str="india,uk,us,uae"

我想拆分它并如下连接每个项目并分配给一些变量

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

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

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

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

4

4 回答 4

3
str="india,uk,us,uae"
var=-myparam=\"${str//,/\" -myparam=\"}\"
echo $var
于 2016-05-19T07:22:54.220 回答
2

将参数读入数组:

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 的这个答案:从数组馈送的命令行参数

于 2016-05-19T06:25:53.800 回答
0

下面的代码会做:

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

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

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

注意: <<<如果我没记错的话,只有少数 shell(Bash、ksh 或 zsh)支持或 herestring。如果您的外壳不支持它,请使用echo,pipe组合。

于 2016-05-19T06:26:11.090 回答
0
IFS=',' read -ra a <<< "${str//,/\",}";
curl "admin/admin" "localhost" "${a[@]/#/ -myParam=\"}\""

 

解释:

从...开始:

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

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

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

最后,我们可以newstr通过参数替换(同时还附加 final "):

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

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

curl "admin/admin" "localhost" "${a[@]/#/ -myParam=\"}\""
于 2016-05-19T10:55:04.717 回答