Shell Script拆分连接和重用

时间:2016-05-19 06:19:13

标签: bash shell unix ifs

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

str="india,uk,us,uae"

我想拆分它并连接下面的每个项目并分配给某个变量

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

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

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

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

4 个答案:

答案 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=\"}\""