【问题标题】:Shell Script split concatenate and re-useShell 脚本拆分连接和重用
【发布时间】:2016-05-19 06:19:12
【问题描述】:

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

str="india,uk,us,uae"

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

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

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

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

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

【问题讨论】:

    标签: bash shell unix ifs


    【解决方案1】:
    str="india,uk,us,uae"
    var=-myparam=\"${str//,/\" -myparam=\"}\"
    echo $var
    

    【讨论】:

    • 我相信这是最好和最简单的方法
    • 我相信这是最简单和最短的答案。但是你有时间能解释一下吗?谢谢
    【解决方案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 的回答:command line arguments fed from an array

    【讨论】:

    • 如果不是引号,我们可以使用"${params[@]/#/-myparam=}"
    • 在我看来,OP 不太可能真的想要这些报价。但是没有足够的细节来冒险一个明确的意见。数组替换建议有很多优点。
    • IFS=, read -a params
    • @Ronnie 只是为了这个声明。你可以通过说IFS=, read -a params &lt;&lt;&lt; "a,b,c" 然后read -a params &lt;&lt;&lt; "a,b,c" 进行测试。每一个之后,执行printf "%s\n" "${params[@]}"。在命令前添加IFS 会使其仅影响命令的范围。
    • @BenjaminW。你是对的。我不想要引号,而是使用了你提到的一行,它解决了我的 for 循环的其他问题。 :)
    【解决方案3】:

    下面的代码可以:

    $ 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"
    

    注意: 如果我没记错的话,&lt;&lt;&lt; 或 herestring 仅在少数 shell(Bash、ksh 或 zsh)中受支持。如果您的 shell 不支持它,请使用 echo,pipe 组合。

    【讨论】:

      【解决方案4】:
      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=\"}\""
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-04
        • 2012-03-15
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        相关资源
        最近更新 更多