9.4.1 数组的复制

9.4  数组操作

数组与其他变量在结构上是有差异的。这意味着对数组进行操作需要一些新的语法。只要可能,对数组的操作在语法上与对字符串做同样的操作都非常相似。但有些情况下的语法不够灵活。

9.4.1 数组的复制

将数组复制到另一个数组非常简单。对于引用与空格而言,重要的是使用格式${array[@]}(而不是${array[*]}),并且要用双引号将整个结构括起来。下面的例子非常清晰地显示了使用其他形式时产生的效果。
 
activities=( swimming "water skiing" canoeing "white-water rafting" surfing )
for act in ${activities[@]}
do
>    echo "Activity: $act"
done
Activity: swimming
Activity: water
Activity: skiing
Activity: canoeing
Activity: white-water
Activity: rafting
Activity: surfing
$
 
导致上面结果的原因在于列表两旁没有使用双引号,所以swimming、water与skiing都被当成独立的单词。在周围添加双引号可以修正这一问题:
 
for act in "${activities[@]}"
do
>    echo "Activity: $act"
done
Activity: swimming
Activity: water skiing
Activity: canoeing
Activity: white-water rafting
Activity: surfing
$
 
同样地,星号*对于引用与不引用都不合适。如果没有引用,它与@符号作用相同。如果使用引用,整个数组会被归结为单个字符串。
 
for act in ${activities[*]}
do
>    echo "Activity: $act"
done
Activity: swimming
Activity: water
Activity: skiing
Activity: canoeing
Activity: white-water
Activity: rafting
Activity: surfing
for act in "${activities[*]}"
do
>    echo "Activity: $act"
done
Activity: swimming water skiing canoeing white-water rafting surfing
$
 
因此,可以用"${activities[@]}"的值定义一个新的数组来对原来的数组进行复制。这样会按照相同的方式保留空白字符,正如上面代码中的for循环显示的一样,空白字符被正确地保留下来。代码如下:
 
hobbies=( "${activities[@]}" )
for hobby in "${hobbies[@]}"
do
>    echo "Hobby: $hobby"
done
Hobby: swimming
Hobby: water skiing
Hobby: canoeing
Hobby: white-water rafting
Hobby: surfing
$
 
然而,这种方式不适用于稀疏数组。索引的实际值不是按照这种方式来传递的,所以hobbies数组不是activities数组的真实副本。
 
activities[10]="scuba diving"
hobbies="( ${activities[@]} )"
for act in `seq 0 10`
> do
>    echo "$act : ${activities[$act]} / ${hobbies[$act]}"
done
0 : swimming / swimming
1 : water skiing / water skiing
2 : canoeing / canoeing
3 : white-water rafting / white-water rafting
4 : surfing / surfing
5 : / scuba diving
6 : /
7 : /
8 : /
9 : /
10 : scuba diving /

$


出处:https://book.2cto.com/201209/3571.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值