在Shell脚本中,我希望实现如下所示:
str="india,uk,us,uae"
我想拆分它并连接下面的每个项目并分配给某个变量
newstr = '-myParam="india" -myParam="uk" -myParam="us" -myParam="uae"'
这样我就可以在下一个命令中使用上面连接的字符串,如下所示
curl "admin/admin" "localhost" $newstr.
我找到了一种使用本地IFS和for循环的方法,但是内部循环更新的变量不会保留循环外的值,因为它在单独的bash中运行。
答案 0 :(得分:2)
str="india,uk,us,uae"
var=-myparam=\"${str//,/\" -myparam=\"}\"
echo $var
答案 1 :(得分:1)
将参数读入数组:
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的这个答案:command line arguments fed from an array。
答案 2 :(得分: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"
注意: <<<
或herestring仅在少数shell(Bash,ksh或zsh)中支持,如果我没记错的话。如果您的shell不支持,请使用echo,pipe
组合。
答案 3 :(得分:0)
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=\"}\""