1. 使用while read line和/etc/passwd,计算用户id总和。
#!/bin/bash
sum=0
while read line ;do
if [[ "$line" =~ /sbin/nologin$ ]] ;then
uid=$(echo $line | cut -d: -f3)
sum=$(($sum+$uid))
fi
done < /etc/passwd
echo "用户id的总和为:$sum"
2. 总结索引数组和关联数组,字符串处理,高级变量使用及示例。
数组名和索引:
- 索引的编号从0开始,属于数值索引
- 索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash 4.0版本之后开始支持
- bash的数组支持稀疏格式(索引不连续)
声明数组:
#普通数组可以不事先声明,直接使用
declare -a ARRAY_NAME
#关联数组必须先声明,再使用
declare -A ARRAY_NAME
注意:两者不可相互转换
数组赋值:
- 一次只赋值一个元素:ARRAY_NAME[INDEX]=VALUE
例如:
weekdays[0]="Sunday"
weekdays[4]="Thursday"
- 一次赋值全部元素:ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)
例如:
title=("ceo" "coo" "cto")
num=({0..10})
alpha=({a..g})
file=( *.sh )- 只赋值特定元素:ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
- 交互式数组值对赋值:read -a ARRAY
显示所有数组:declare -a
引用数组:
- 引用特定的数组元素
${ARRAY_NAME[INDEX]} #如果省略[INDEX]表示引用下标为0的元素- 引用数组所有元素
${ARRAY_NAME[*]}
${ARRAY_NAME[@]}- 数组的长度,即数组中元素的个数
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}- 数组的所有下标
${!ARRAY_NAME[*]}
${!ARRAY_NAME[@]}删除数组:
- 删除数组中的某元素,会导致稀疏格式
unset ARRAY[INDEX]- 删除整个数组
unset ARRAY数组数据处理:
- 数组切片
${ARRAY[@]:offset:number}
${ARRAY[*]:offset:number}
offset #要跳过的元素个数
number #要取出的元素个数
#取偏移量之后的所有元素
{ARRAY[@]:offset}
{ARRAY[*]:offset}- 向数组中追加元素
ARRAY[${#ARRAY[*]}]=value
ARRAY[${#ARRAY[@]}]=value关联数组:必须先声明再调用
declare -A ARRAY_NAMEARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)
字符串处理:
- 字符串切片
(1)基于偏移量取字符串
#返回字符串变量var的字符的长度,一个汉字算一个字符
${#var}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分, offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset}
#返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var:offset:number}
#取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
#从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
#先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length 前空格,并且length必须大于offset
${var: -length:-offset}
(2)基于模式取子串
#其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字 符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
${var#*word}
#从var变量的值中删除以word开头的部分