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