Shell脚本-将字符串拆分为数组时检查长度

5

我是一名使用Bash脚本的IT技术人员,目前遇到了一个问题:我需要拆分一个字符串中包含URL地址的部分。例如:

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

所以这些URL由空格分隔,我已经使用了IFS命令来拆分字符串,它运行良好,我可以通过以下方式遍历这两个URL:
for url in $str; do
    #some stuff
done

但是我的问题是我需要知道这个分割有多少项,所以对于str的例子,它应该返回2,但使用以下代码:

${#str[@]}

返回字符串的长度(对于当前示例为40),即我需要获取2的字符数。

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

有什么建议吗?

4个回答

5
将字符串拆分为数组并使用该数组替代:
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,这可能不会有太大影响,但总体而言,这将防止通配符扩展和一些空格问题,并且它是其他命令(如wget -i)所使用的规范格式。


我正在使用Python脚本生成URL,因此我可以更改它并使其打印多行。我该如何将它们放入数组中?您能否也更新一下吗? - eLRuLL
我最终使用了一个多行文件,但数组也很好用。 - eLRuLL

5
你应该使用类似这样的内容。
declare -a a=( $str )
n=${#a[*]} # number of elements

2

有几种方法:

$ 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

0
如果您创建一个将回显$*的函数,那么它应该提供要拆分的项目数量。
count_params () { echo $#; }

将$str传递给此函数将会得到结果。
str="firsturl.com/123416 secondurl.com/634214"
count_params $str

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接