5

我正在使用一个 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

4 回答 4

5

你应该使用这样的东西

declare -a a=( $str )
n=${#a[*]} # number of elements
于 2013-06-28T04:06:31.200 回答
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)使用的规范格式。

于 2013-06-28T04:07:07.960 回答
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
于 2013-06-28T04:28:44.070 回答
0

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

count_params () { echo $#; }

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

str="firsturl.com/123416 secondurl.com/634214"
count_params $str
于 2013-06-28T04:10:36.217 回答