文章目录
- 打印数组与长度
- 数组遍历
- 数组赋值
- 下标索引访问
- 切片
- 追加(+=)
- 删除
- 关联数组(像map)
- 字符串
- 字符拼接
- 截取子串
- 字符串长度
- 字符串替换
- 模式匹配截取
- 分割字符串
- 大小写转换
打印数组与长度
- ${arrayName[*]} 打印数组
- ${arrayName[@]} 打印数组
- ${#arrayName[*]} 打印数组长度
- ${#arrayName[@]} 打印数组长度
#!/bin/bash
array=("a" "b" "c")
# 输出 a b c
echo ${array[@]}
# 输出 a b c
echo ${array[*]}
# 输出3
echo ${#array[@]}
echo ${#array[*]}
数组遍历
#!/bin/bash
array=("a" "b" "c")
# 输出
# a
# b
# c
for item in ${array[@]}
do
echo $item
done
# 输出
# a
# b
# c
for item in ${array[*]}
do
echo $item
done
# 输出 a b c
for item in "${array[*]}"
do
echo $item
done
# 输出
# a
# b
# c
for item in "${array[@]}"
do
echo $item
done
重点注意一下有双引号的 a r r a y [ @ ] 与 {array[@]}与 array[@]与{array[*]}不同
数组赋值
#!/bin/bash
array=$1
function printArray(){
for num in ${array[@]}
do
echo "data in array:$num"
done
return 0
}
# 直接赋值
array=(1 2 3)
printArray $array
# 通过下标索引
array=([0]=1 [1]=2 [2]=3)
printArray $array
array[0]="1"
array[1]="2"
array[2]="3"
printArray $array
# 通过字符串
list="1 2 3"
array=($list)
printArray $array
下标索引访问
#!/bin/bash
array=(1 2 3 4)
# 输出1 2 3 4
echo ${array[@]}
# 输出1
echo ${array[0]}
# 输出3
echo ${array[2]}
切片
#!/bin/bash
array=(1 2 3 4 5)
# 输出数组1 2 3 4 5
echo ${array[@]}
# 从索引为1开始,截取3位:2 3 4
echo ${array[@]:1:3}
# 输出数组1-1下标的值:2
echo ${array[@]:1:1}
# 输出数组1索引1及其后面的所有元素:2 3 4 5
echo ${array[@]:1}
追加(+=)
#!/bin/bash
array=(1 2 3 4 5 6 7 8 9)
array+=(10 11)
echo ${array[@]}
删除
#!/bin/bash
array=(1 2 3 4 5)
echo ${array[@]}
# 删除索引2对应的元素,元素3被删除
unset array[2]
echo ${array[@]}
unset array
# 数组为空
echo ${array[@]}
关联数组(像map)
#!/bin/bash
# 关联数组要先声明
declare -A state
for((i=0;i<10;i++))
do
let state["A"]+=i
let state["B"]+=(i*2)
let state["C"]+=(i*3)
let state["啊啊"]+=(i*4)
done
# 注意感叹号(!)
for s in ${!state[@]}
do
echo "$s: ${state[$s]}"
done
统计指定文件中单词出现次数:
#!/bin/bash
declare -A array
for i in `cat awk.txt`
do
let array[$i]++
done
for i in ${!array[*]}
do
echo "$i 出现了${array[$i]} 次"
done
字符串
字符串可以看做是特殊的数组
字符拼接
#!/bin/bash
v1="Hello"
v2="World"
result="$v1 $v2"
# Hello World
echo $result
截取子串
#!/bin/bash
v1="Hello World"
# Hello
echo ${v1:0:5}
# World
echo ${v1:6:5}
字符串长度
#!/bin/bash
str="Hello World"
echo "${str}字符串的长度为:${#str}"
字符串替换
#!/bin/bash
str="aa bb aa cc dd aa"
strB="ee aa bb aa cc dd aa ff"
# 默认替换第1个
v1=${str/aa/11}
echo "替换之后:$v1"
# /替换所有
v1=${str//aa/11}
echo "替换之后:$v1"
# #替换开头位置的aa
v1=${str/#aa/11}
echo "替换之后:$v1"
# #替换开头位置的aa,这里开头是ee所有不会替换
v1=${strB/#aa/11}
echo "替换之后:$v1"
# %替换最后位置的aa
v1=${str/%aa/11}
echo "替换之后:$v1"
# %替换最后位置的aa,这里结尾位置是ff,所以不会替换
v1=${strB/%aa/11}
echo "替换之后:$v1"
模式匹配截取
- %保留左边,最短匹配,从右边开始,匹配到第一个模式结束
- %%保留左边,最长匹配,从右边开始,匹配到最后一个模式为止
- #保留右边,最短匹配,从左边开始,匹配到第一个模式结束
- ##保留右边,最长匹配,从左边开始,匹配到最后一个模式为止
#!/bin/bash
v1="https://127.0.0.1:8080/web/index.html"
# 结果:https://127.0.0.1:8080/web,从右往左,匹配最短/*并删除
r=${v1%/*}
echo "%右短模式结果:$r"
# 结果:https:,从右往左,匹配最长/*并删除
r=${v1%%/*}
echo "%%右长模式结果:$r"
# 结果:/127.0.0.1:8080/web,从左往右,匹配最短*/并删除
r=${v1#*/}
echo "#左短模式结果:$r"
# 结果:index.html,从左往右,匹配最长*/并删除
r=${v1##*/}
echo "##左长模式结果:$r"
分割字符串
#!/bin/bash
lans="Java;Go;Python;C++;Rust"
# 将;替换为换行
lanArray=($(echo $lans | tr ";" "\n"))
i=1
for lan in "${lanArray[@]}"
do
echo "第$i 次循环:$lan"
let i+=1
done
大小写转换
#!/bin/bash
# 转为大写
str="Hello World"
upperStr=$(echo $str | tr '[:lower:]' '[:upper:]')
echo $upperStr
# 转为小写
str="Hello World"
lowerStr=$(echo $str | tr '[:upper:]' '[:lower:]')
echo $lowerStr