我正在使用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
时的字符数。
使用计数器进行迭代也行不通,因为在迭代数组之前我需要元素数。
有什么建议吗?
答案 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"
$ while read -a ary; do echo ${#ary[@]}; done <<< "$str"
2
$ awk '{print NF}' <<< "$str"
2
$ printf "%s\n" $(printf "$str" | wc -w)
2
$ set -- $str
$ echo ${#@}
2
答案 3 :(得分:0)
如果您创建一个将回显$ *的函数,则应该提供要拆分的项目数。
count_params () { echo $#; }
然后将$ str传递给此函数将为您提供结果
str="firsturl.com/123416 secondurl.com/634214"
count_params $str