【问题标题】:Shell script - check length when splitting string to arrayShell脚本 - 将字符串拆分为数组时检查长度
【发布时间】:2013-06-29 05:47:28
【问题描述】:

我正在使用一个 bash 脚本,我正在尝试拆分一个带有 url 的字符串,例如:

str=firsturl.com/123416 secondurl.com/634214

所以这些 URL 是用空格分隔的,我已经使用了 IFS 命令来分割字符串并且效果很好,我可以遍历这两个 URL:

for url in $str; do
    #some stuff
done

但我的问题是我需要得到这个拆分有多少项目,所以对于str 示例它应该返回 2,但使用这个:

${#str[@]}

返回字符串的长度(当前示例为40),我的意思是字符数,当我需要获取2时。

使用计数器进行迭代也不起作用,因为在迭代数组之前我需要元素的数量。

有什么建议吗?

【问题讨论】:

    标签: linux bash shell


    【解决方案1】:

    将字符串拆分成一个数组并使用它来代替:

    str="firsturl.com/123416 secondurl.com/634214"
    array=( $str )
    
    echo "Number of elements: ${#array[@]}"
    for item in "${array[@]}"
    do
      echo "$item"
    done
    

    你不应该有一个空格分隔的字符串列表。如果您从其他命令逐行获取它们,则可以使用while read 循环:

    while IFS='' read -r url
    do
      array+=( "$url" )
    done
    

    对于正确编码的 URL,这可能不会产生太大影响,但一般来说,这将防止 glob 扩展和一些空白问题,并且它是其他命令(如 wget -i)使用的规范格式。

    【讨论】:

    • 我正在从 python 脚本生成 url,所以我可以更改它并使其打印多行。我怎样才能把它们放在一个数组上?你能更新一下吗?
    • 我最终使用了一个多行文件,但数组也很好用。
    【解决方案2】:

    你应该使用这样的东西

    declare -a a=( $str )
    n=${#a[*]} # number of elements
    

    【讨论】:

      【解决方案3】:

      几种方式:

      $ str="firsturl.com/123416 secondurl.com/634214"
      

      bash 数组:

      $ while read -a ary; do echo ${#ary[@]}; done <<< "$str"
      2
      

      awk:

      $ awk '{print NF}' <<< "$str"
      2
      

      *nix 实用程序:

      $ printf "%s\n" $(printf "$str" | wc -w)
      2
      

      bash 没有数组:

      $ set -- $str
      $ echo ${#@}
      2
      

      【讨论】:

        【解决方案4】:

        如果您创建一个将回显 $* 的函数,那么它应该提供要拆分的项目数。

        count_params () { echo $#; }
        

        然后将 $str 传递给这个函数会给你结果

        str="firsturl.com/123416 secondurl.com/634214"
        count_params $str
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-20
          • 2014-08-16
          • 2020-08-14
          • 1970-01-01
          • 1970-01-01
          • 2020-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多