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

时间:2013-06-28 03:41:38

标签: linux bash shell

我正在使用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时的字符数。

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

有什么建议吗?

4 个答案:

答案 0 :(得分:5)

你应该使用这样的东西

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

答案 1 :(得分: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,这可能不会产生太大的影响,但一般来说,这会阻止glob扩展和一些空白问题,而且这是其他命令(如wget -i)工作的规范格式用。

答案 2 :(得分: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 utlity:

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

bash without array:

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

答案 3 :(得分:0)

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

count_params () { echo $#; }

然后将$ str传递给此函数将为您提供结果

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