BASH数据操作
数组声明与删除
declare -a array_name # 声明数组,也可以不声明
declare -a nums=(1 2 3 4) # 声明数组,同时也可给数组赋值
unset array_name # 删除数组
unset nums[0] # 删除数组中的某个元素
备注:
数组可以不声明直接赋值
数组中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推
声明字典
declare -A dict_name # 声明字典
declare -A dict_name=([name]=Alice [age]=18) # 声明字典,并赋值
备注:
字典类型必须显式声明才能使用
数组赋值
# 方式一
array_name=(
value0
value1
value2
value3
)
# 方式二
names=(Jerry Alice David Wendy)
# 方式三
names[0]=Jerry
names[1]=Alice
names[2]=David
names[3]=Wendy
# 方式四
names=([0]=Jerry [1]=Alice [2]=David [3]=Wendy)
# 方式五
str="Jerry Alice David Wendy"
names=($str)
备注:
数组中的元素,必须以空格来隔开
定义数组其索引,可以不按顺序来定义,比如说:names=([0]=Jerry [1]=Alice [2]=David [8]=Wendy)
数组新增元素
# 方式一
names=("$names[@]" Tom)
# 方式二
names[${#names[@]}]=Tom # 此方式仅使用于数组下标是从0开始的连续下标
# 如果要在某个指定的元素后面插入新元素,则要遍历数组做判断操作
字典赋值
# 方式一
declare -A dict_name=(
[name]=Alice
[age]=18
)
# 方式二
declare -A dict_name
dict_name[name]=Alice
dict_name[age]=18
备注:
必须使用declare -A声明为字典类型才能使用
数组长度
# 示例数组
names=(Jerry Alice David Wendy)
# 计算数组元素的有效个数
${#names[@]}
# 等价方式
${#names[*]}
# 备注:
# 有效个数是指数组的真实元素个数,于数组的最大下标无关
# 举个例子,定义数组:arr=([0]=One [9]=Two)
# 这个数组的有效个数是2,而最大下标是9
# 补充:计算元素的长度,相当于求字符串的长度
# 方式一
${#names[0]} # 求数组下标为0的元素的长度,下同
# 方式二
expr length "${names[0]}"
# 方式三
echo "${names[0]}" | wc -L
# 方式四
echo -n "${names[0]}" | wc -c
# 方式五
expr "${names[0]}" : ".*"
# 方式六
echo "${names[0]}" | awk '{print length($0)}'
字符串转数组
# 以空格分隔的字符串
str="1 2 3 4"
arr=($str)
# 以指定字符分隔
str="1.2.3.4"
# 方式一
arr=(${str//./ })
# 方式二
arr=($(echo $str|tr '.' ' '))
# 方式三
arr=($(echo $str|sed 's/\./ /g'))
# 方法有很多,无非就是把分割字符替换成空格
删除数组元素
# 示例数组
names=(Jerry Alice David Wendy)
# 删除元素
unset names[0]
遍历数组
# 方式一
for item in "${names[@]}"; do
#do something
echo "$item"
done
# 方式二
for index in "${!names[@]}"; do
#do something
echo "${names[$index]}"
done
# 使用误区
for ((i=0;i<${#names[@]};i++)); do
#do something
echo "${names[$i]}"
done
# 有的文章提供了这种的遍历方式,使用上是可能会出问题的
# 如:数组定义:arr=([0]=One [9]=Two)
# 执行结果就不正确了。也就是说这种方式只适用于数组是从0开始的连续连续下标
数组取值和切片
# 示例数组
arr=(Jerry Alice David Wendy)
# 取值
$arr # 取数组下标为0的元素,是${names[0]}的简写
${arr[0]} # 取数组下标为0的元素
${arr[@]} # 取出所有元素
${arr[@]:(-1)} # 取最后一个元素
# 切片
${arr[@]:1} # 从索引为1到后面的所有元素
${arr[@]:1:2} # 从索引为1开始取,取2个元素
${arr[@]::2} # 取前2个元素,是${arr[@]:0:2}的简写
${arr[@]:0:2} # 取前2个元素
${arr[@]:(-2):2} # 从最大索引-2+1开始取,取2个元素