shell基础+强化
shell脚本
一、shell介绍
- 什么是shell
- shell功能
1.什么是shell
shell是一个程序,采用C语言编写,是用户和Linux内核沟通的桥梁。它既是一种命令语言,又是一种解释性的编程语言。通过一个图标来查看以下设立了的作用
扩展知识
kernel(内核):为软件服务,接收用户或软件指令驱动硬件,完成工作;
shell:命令解释器
user:用户接口,对接用户
从上图可以看出,shell在操作系统中起到了承接用户和系统内核的作用。那为什么步直接用户对内核呢?
原因很简单,因为内核处理的都是二进制,而用户处理的都是高级语言。简而言之,如果没有shell,你希望告诉你喜欢的妹子:我爱你。你需要经过以下步骤:
- 将“我爱你”翻译成二进制
- 告诉内核
- 内核通过网卡发送给你的妹子
- 妹子计算机网卡收到你发的二进制
- 网卡交给内核
- 内核交给妹子
- 妹子看到都是一串01组成的数字,o my god,二进制不是人人都懂的,你的表白也就石沉大海了。
为了让所有人都能够快速、方便地使用计算机,我们打的系统开发人员通过shell解决了这个问题。使任何一个希望通过计算机来工作、娱乐的人都能够快速操作计算机。
2. shell功能
- 命令行解释功能
- 启动程序
- 输入输出重定向
- 管道连接
- 文件名置换(echo /*)
- 变量维护
- 环境控制
- shell编程
二、shell语法
- 如何书写一个shell脚本
- shell脚本运行
- shell中的特殊符号
- 管道
- 重定向
- shell中数学运算
- 脚本退出
**shell脚本就是将完成一个任务的所有命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。
1.如何书写一个shell脚本
shell脚本的命名:
名字要有意义,最好不要用a、b、c、d、1、2、3、4这中方式命名;虽然在linux系统中,文件没有扩展名的概念,依然建议你用.sh结尾;名字不要太长,最好能在30个字节以内解决。例如check_memory.sh
shell脚本格式:
shell脚本开头必须指定脚本运行环境,以#!
这个特殊符号组合了组成。如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的:
shell中的注释使用#
号
shell脚本中,最好加入脚本说明字段
#!/bin/bash
#Author: xxx
#Created Time: xxxx/xx/xx xx:xx
#Release:1.0
#Script Description: first shell study script
2.如何运行一个shell脚本
脚本运行需要执行权限,当我们给一个文件赋予执行权限后,该脚本就可以运行
chmod u+x filename
如果不希望赋予脚本执行权限,那么可以使用bash命令来运行未给予执行权限的脚本
bash filename
3. shell中的特殊符号
符号 | 描述 |
---|---|
~ | 家目录 # cd ~ 代表进入用户家目录 |
! | 执行历史命令 ~~执行上一条命令 |
$ | 变量中取内容符 |
+ – * / % | 对应数学运算 加 减 乘 除 取余 |
& | 后台执行 |
* | 型号是shell中的通配符,匹配所有 |
? | 问号是shell中的通配符,匹配除回车以外的一个字符 |
; | 分号可以在shell中一行执行多个命令,命令hi加用分号分隔 |
| | 管道符,上一个命令的输出作为下一个命令的输入 cat filename | grep “abc” |
\ | 转义字符 |
`` |
反引号 命令中执行命令 echo “today is /date +%F/ ”
|
‘ ‘ | 单引号,脚本中字符串要用单引号引起来,但不同于双引号的是,单引号不解释变量 |
” “ | 双引号,脚本中出现的字符串可以用双引号引起来 |
4. shell中管道的运用
| 管道符在shell中使用是最多的,很多组合命令都需要通过组合命令来完成输出。管道符其实就是下一个命令对上一个命令的输出做处理。
5. shell重定向
- > 重定向输入 覆盖原数据
- >> 重定向追加输入,在原数据的末尾添加
- < 重定向输出 wc -l < /etc/passwd
- << 重定向追加输出 fdisk /dev/sdb <
6. shell数学运算
expr 命令:只能做整数运算,格式比较古板,注意空格
expr 1 + 1
expr 5 - 2
expr 5 \* 2
expr 5 / 2
expr 5 % 2
使用bc计算器处理浮点运算,sacle=2代表小数点保留两位
echo "scale=2;3+100"|bc
echo "scale=2;100-3"|bc
echo "scale=2;100/3"|bc
echo "scale=2;100*3"|bc
双小圆括号运算,在shell中(())也可以用来做数学运算
echo $(( 100+3))
echo $(( 100-3))
echo $(( 100%3))
echo $(( 100*3))
echo $(( 100/3))
echo $(( 100**3)) //开方运算
7.退出脚本
exit NUM:退出脚本,释放系统资源,NUM代表一个整数,代表返回值。
三、shell格式化输出
- echo命令
- 颜色输出
一个程序需要有0个或以上输入,一个或更多输出
1. echo命令介绍
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。 该命令的一般格式为:echo [ -n ]字符串
其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。
功能说明:显示文字。
语法:
echo [-ne][字符串]
echo [--help][--version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。
命令选项:
-n:不要在最后自动换行;
-e:若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
转义字符:
转义字符 | 描述 |
---|---|
\a | 发出警告声 |
\b | 删除前一个字符 |
\c | 最后不加上换行符号 |
\f | 换行但光标仍旧停留在原来的位置 |
\n | 换行且光标移至行首 |
\r | 光标移至行首,但不换行 |
\t | 插入tab |
\v | 与\f相同 |
\ | 插入\字符 |
\nnn | 插入nnn(八进制)所代表的ASCII字符 |
举例:输出一个菜单
#!/bin/bashecho -e "\t\t\t\tFruit Shop"
echo -e "\t1) Apple"
echo -e "\t2) Orange"
echo -e "\t3) Banana"
输出
Fruit Shop1) Apple2) Orange3) Banana
2.颜色代码
脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
格式如下:
echo -e “\033[字背景颜色;文字颜色m字符串\033[0m”
例如:
echo -e “\033[41;36m something here \033[0m”
- 字背景颜色和文字颜色之间是英文的””
- 文字颜色后面有个m
- 字符串前后可以没有空格,如果有的话,输出也是同样有空格
下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配例echo -e “\033[31m 红色字 \033[0m”echo -e “\033[34m 黄色字 \033[0m”echo -e “\033[41;33m 红底黄字 \033[0m”echo -e “\033[41;37m 红底白字 \033[0m”字颜色:30—–37echo -e “\033[30m 黑色字 \033[0m”echo -e “\033[31m 红色字 \033[0m”echo -e “\033[32m 绿色字 \033[0m”echo -e “\033[33m 黄色字 \033[0m”echo -e “\033[34m 蓝色字 \033[0m”echo -e “\033[35m 紫色字 \033[0m”echo -e “\033[36m 天蓝字 \033[0m”echo -e “\033[37m 白色字 \033[0m”字背景颜色范围:40—–47echo -e “\033[40;37m 黑底白字 \033[0m”echo -e “\033[41;37m 红底白字 \033[0m”echo -e “\033[42;37m 绿底白字 \033[0m”echo -e “\033[43;37m 黄底白字 \033[0m”echo -e “\033[44;37m 蓝底白字 \033[0m”echo -e “\033[45;37m 紫底白字 \033[0m”echo -e “\033[46;37m 天蓝底白字 \033[0m”echo -e “\033[47;30m 白底黑字 \033[0m”最后面控制选项说明\033[0m 关闭所有属性\033[1m 设置高亮度\033[4m 下划线\033[5m 闪烁\033[7m 反显\033[8m 消隐\033[30m — \33[37m
设置前景色\033[40m — \33[47m 设置背景色\033[nA 光标上移n行\033[nB 光标下移n行\033[nC 光标右移n行\033[nD 光标左移n行\033[y;xH设置光标位置\033[2J 清屏\033[K 清除从光标到行尾的内容\33[s 保存光标位置\033[u 恢复光标位置\033[?25l 隐藏光标\033[?25h 显示光标
四、shell基本输入
- read命令
1. read命令
默认接受键盘的输入,回车符代表输入结束
read 命令选项 | 描述 |
---|---|
-p | 打印信息 |
-t | 限定时间 |
-s | 不回显 |
-n | 输入字符个数 |
五、shell变量
- 变量介绍
- 变量分类
- 变量管理
1.变量介绍
- 在编程中,我们总有一些数据需要临时存放在内存,以待后续使用时快速读出。内存在系统启动的时候被按照1B一个单位划分为若干个块,然后统一
- 编号(16进制编号),并对内存的使用情况做记录,保存在内存跟踪表中。
变量:变量是编程中最常用的一种临时在内存中存取数据的一种方式。
从图片可以看出,当我们在脚本中定义变量存值的时候,可以从以下方面看到变化:
- 内存占用:如果存的是一个字符则占用1个字节,如果存的是字符串则是字符串的长度加1个字节长度(\0是一个特殊字符,代表字符串结束)。
- 变量名与内存空间关系:计算机中会将对应的内存空间和变量名称绑定在一起,此时代表这段内存空间已经被程序占用,其他程序不可复用;然后将变量名对应的值存在对应内存地址的空间里。
2.变量分类
- 本地变量:用户私有变量,只有本用户可以使用,保存在家目录下的.bash_profile、.bashrc文件中
- 全局变量:所有用户都可以使用,保存在/etc/profile、/etc/bashrc文件中
- 用户自定义变量:用户自定义,比如脚本中的变量
3.定义变量
3.1定义变量
变量格式:变量名=值
在shell编程中的变量名和等号之间不能有空格
变量命名规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
VAR1=1age=18name='baism'score=88.8
注意:字符串要用单引号或双引号引起来
3.2读取变量内容
读取变量内容符:$
读取方法:$变量名
echo $name
echo $school
echo $age
echo $score
3.3取消变量unset
unset name
echo $name
3.4定义全局变量export
export name='Tom'
注意:
- 上述设置的变量其实都是一次性变量,系统重启就会丢失。
- 如果希望本地变量或者全局变量可以永久使用,可以将需要设置的变量写入变量文件中即可。
3.5定义永久变量
本地变量:用户私有变量,只有本用户可以使用,保存在家目录下的.bash_profile、.bashrc文件中
全局变量:所有用户都可以使用,保存在/etc/profile、/etc/bashrc文件中
#本地变量
tail -1 ~/.bash_profile
name='baism'#全局变量
tail -1 /etc/profile
export age=30
六、shell数组
- 数组介绍
- 基本数组
- 关联数组
- 案列分享
1.数组介绍
一个变量只能存一个值,但是现实中又又很多值需要存储,那么变量就有些拘谨了。比如做一个学员信息表,一个班50个人,每个人6条信息,我们需要定义300个变量才能完成。恐怖恐怖,这只是一个班的学生,一个学校呢?一个市呢?……我想静静了!
仔细想想上述的案例,一个学生六个信息:ID、姓名、性别、年龄、成绩、班级。可不可以定义六个变量就能存储这六类信息呢?答案是当然可以的!变量不行,我们就用数组。
2.基本数组
数组可以让用户一次赋予多个值,需要读取数据时只需通过索引调用就可以方便读出了。
2.1数组语法
数组名称=(元素1 元素2 元素3 ...)
2.2数组读出
${数组名称[索引]}
索引默认是元素在数组中的排队编号,默认第一个从0开始
2.3数组赋值
方法一:一次赋一个值
array0[0]='tom'
array0[1]='jarry'
array0[2]='natasha'
方法二: 一次赋多个值
array2=(tom jack alice)
array3=(cat /etc/passwd) #希望是将该文件中的每一个行作为一个元素赋值给数组array3
array4=(ls /var/ftp/Shell/for*)
array5=(tom jack alice “bash shell”)
2.4查看数组
declare -a
declare -a array1='([0]=”pear” [1]=”apple” [2]=”orange” [3]=”peach”)'
declare -a array2='([0]=”tom” [1]=”jack” [2]=”alice”)'
2.5访问数组元素
echo ${array1[0]} #访问数组中的第一个元素
echo ${array1[@]} #访问数组中所有元素 等同于 echo ${array1[*]}
echo ${#array1[@]} #统计数组元素的个数
echo ${!array2[@]} #获取数组元素的索引
echo ${array1[@]:1} #从数组下标1开始
echo ${array1[@]:1:2} #从数组下标1开始,访问两个元素
2.6遍历数组
默认数组通过数组元素的个数进行遍历
echo ${ass_array2[index1]}
echo ${ass_array2[index2]}
echo ${ass_array2[index3]}
echo ${ass_array2[index4]}
方法二: 针对关联数组可以通过数组元素的索引进行遍历
3.关联数组
关联数组可以允许用户自定义数组的索引,这样使用起来更加方便、高效。
3.1定义关联数组
申明关联数组变量
declare -A ass_array1
declare -A ass_array2
3.2关联数组赋值
方法一: 一次赋一个值
数组名[索引]=变量值
ass_array1[index1]=pear
ass_array1[index2]=apple
ass_array1[index3]=orange
ass_array1[index4]=peach
方法二: 一次赋多个值
ass_array2=([index1]=tom [index2]=jack [index3]=alice [index4]=’bash shell’)
3.3查看数组
declare -A
declare -A ass_array1=’([index4]=”peach” [index1]=”pear” [index2]=”apple” [index3]=”orange” )’
declare -A ass_array2=’([index4]=”bash shell” [index1]=”tom” [index2]=”jack” [index3]=”alice” )’
3.4访问数组元素
echo ${ass_array2[index2]} #访问数组中的第二个元数
echo ${ass_array2[@]} #访问数组中所有元数 等同于 echo ${array1[*]}
echo ${#ass_array2[@]} #获得数组元数的个数
echo ${!ass_array2[@]} #获得数组元数的索引
3.5遍历数组
通过数组元数的索引进行遍历,针对关联数组可以通过数组元素的索引进行遍历
echo ${ass_array2[index1]}
echo ${ass_array2[index2]}
echo ${ass_array2[index3]}
echo ${ass_array2[index4]}
4.案例分享——学员信息系统
#!/bin/bash
#Author:s1ng
#Date:2022/2/21
#Description:学员查询系统
for ((i=0;i<3;i++))doread -p "输入第$((i+1))个人名:" name[$i]read -p "输入第$((i+1))个年龄:" age[$i]read -p "输入第$((i+1))个性别:" gender[$i]done
clearecho -e "**********学员查询系统**********"echo -e "\033[41;36m 若要退出 输入:Q\033[0m"
while :
docp=0read -p "输入要查询的姓名:" xm[ $xm == "Q" ]&&exitfor ((i=0;i<3;i++))doif [ "$xm" == "${name[$i]}" ];thenecho "${name[$i]} ${age[$i]} ${gender[$i]}"cp=1fidone[ $cp -eq 0 ]&&echo "not found student!"
done
七、shell流程控制-if判断语句
- shell中的五大运算
- if语法
当我们在写程序的时候,时常对上一步执行是否成功如何判断苦恼,当我们今天学习了if就可以解决你的苦恼。if语句在我们程序中就是用来做判断的,以后大家不管学习什么语言,以后只要涉及到判断的部分,大家就可以直接拿if来使用,不同的语言之间的if只是语法不同,原理是相同的。
1. shell中的运算
1.1数学比较运算
运算符解释:
运算符 | 描述 |
---|---|
-eq | 等于 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于或等于 |
-le | 小于或等于 |
-ne | 不等于 |
test 1 -eq 1;$? #0(shell中0为真,1为假)
test 1 -lt 1;$? #1
1.2字符串比较运算
运算符解释,注意字符串一定别忘了使用引号引起来
运算符 | 描述 |
---|---|
== | 等于 |
!= | 不等于 |
-n | 检查字符串的长度是否大于0 |
-z | 检查字符串的长度是否为0 |
test 'abc' -n
1.3文件比较与检查
运算符 | 描述 |
---|---|
-d | 检查文件是否存在且为目录 |
-e | 检查文件是否存在 |
-f | 检查文件是否存在且为文件 |
-r | 检查文件是否存在且可读 |
-s | 检查文件是否存在且不为空 |
-w | 检查文件是否存在且可写 |
-x | 检查文件是否存在且可执行 |
-O | 检查文件是否存在并且被当前用户拥有 |
-G | 检查文件是否存在并且默认组为当前用户组 |
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧
file1 -ef file2 检查file1是否与file2是同一个文件
test -d /opt/shell;echo $? #0
test -e /opt/shell/shell_05.sh;echo $? #0
1.4逻辑运算
运算符 | 描述 |
---|---|
&& | 逻辑与运算 |
|| | 逻辑或运算 |
! | 逻辑非运算 |
if [ 1 -eq 1 ] && [ 2 -eq 2 ];then echo "yes";else echo "no";fi #yes
逻辑运算注意事项:逻辑与 或 运算都需要两个或以上条件,逻辑非运算只能一个条件。
1.5赋值运算
=:赋值运算符
a=10
name='baism'
2. if语法
2.1语法一:单if语句
适用范围:只需要一步判断,条件返回真干什么或者条件返回假干什么。
语句格式
if [ condition ] #condition 值为true or falsethencommands
fi
判断当前用户是不是root,如果不是那么返回”ERROR: need to be root so that!“
#!/bin/bashif[ $USER != 'root' ]thenecho "ERROR:need to be so that"exit 1
fi
2.2语法二:if-then-else语句
适用范围:两步判断,条件为真干什么,条件为假干什么。
if [ condition ]thencommands1
elsecommands2
fi
判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如果是普通用户输出”hey guest“
if [ $USER == 'root' ]then echo "hey admin"
else echo "hey guest"
fi
2.3语法三:if-then-elif语句
适用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件。
if [ condition 1]thencommands1
elif [ condition 2]thencommands2.......
elsecommandsX
fi
通过一个脚本,判断两个整数的关系。
if [ $1 -gt $2 ]thenecho "$1 > $2"
elif [ $1 -eq $2 ]thenecho "$1 = $2"
elseecho "$1 < $2"
fi
3. if高级应用
- 条件符号使用双圆括号,可以在条件中植入数学表达式
if (( 100%3+1>1 ));thenecho "yes"
elseecho "no"
fi
注意 双小圆括号中的比较运算符 使用的是我们传统的比较运算符 >>= == <<= !=
2.使用双方括号,可以在条件中使用通配符
为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串
#!/bin/bash
for i in r1 rr2 cc rr3doif [[ $i == r* ]];thenecho $ifi
done
为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串
八、shell流程控制-for循环语句
- for循环介绍
- for语法
- 循环控制
脚本在执行任务的时候,总会遇到需要循环执行的时候,比如说我们需要脚本每隔五分钟执行一次ping的操作,除了计划任务,我们还可以使用脚本来完成,那么我们就用到了循环语句。
1. for 循环介绍
很多人把for循环叫做条件循环,或者for i in 。其实前者说的就是for的特性,for循环的次数和给予的条件是成正比的,也就是你给5个条件,那么他就循环5次;后者说的是for的语法。
循环的优点:
- 节省内存(完成同一个任务)
- 结构更清晰
- 节省时间成本
2. for语法
2.1 for 语法一
for var in value1 value2 ......docommands
done
循环输出1-9数字
#!/bin/bash
for i in `seq 1 9` #seq 1 9 是从1数到9doecho $i
done
2.2 for语法二
C式的for命令
for ((变量;条件;自增减运算 ))do代码块
done
输出1-9
#!/bin/bash
for (( i=1;i<10;i++ ))doecho $i
done
for循环使用多个变量
#!/bin/bash
for (( a=0,b=9;a<10;a++,b-- ))doecho $a,$b
done
for 无限循环 使用((;
shell基础+强化相关推荐
- day23:shell基础介绍 alias及重定向
2019独角兽企业重金招聘Python工程师标准>>> 1.shell基础介绍: shell是一个命令解释器,用于用户与机器的交互: 也支持特定的语法(逻辑判断,循环): 每个用户都 ...
- shell基础(四)uniq和tee
shell基础(四)uniq和tee uniq用来去重复的行,最常用的选项只有一个,即-c count 统计重复的行数,并把重复的数量写在前面. 注意:使用前提是需要先给文件排序,否则不管用. #vi ...
- linux shell 基础 使用日志与心得
linux shell 基础 使用日志与心得 1.#!/bin/bash 第一行就出现 #!/bin/bash是指此脚本使用/bin/bash来解释执行. 其中,#!是一个特殊的表示符,其后,跟着解释 ...
- 一、Linux Shell基础
1.1.shell基础 Bash 是一个与Bourne Shell兼容的.执行从标准输入设备文件读取的命令的语言解释器.Bash是Bournae-Again Shell的缩写.Bash与原来的Unix ...
- Xamarin.Forms Shell基础教程(1)
Xamarin.Forms Shell基础教程(1) 什么是Xamarin.Forms Shell Shell是Visual Studio为Xamarin Forms提供的解决方案模版.本质上,She ...
- linux shell概述,Linux学习 -- Shell基础 -- 概述
Shell是什么? 命令解释器 编程语言 Linux支持的Shell类型 cat /etc/shells 主要学习 bash 脚本执行方式 echo echo -e 单引号 -- 原始字符串 双引号 ...
- Shell基础-环境变量配置文件
Shell基础-环境变量配置文件 Shell基础-环境变量配置文件 source 配置文件 或者 . 配置文件: 把环境变量写入配置文件后,需要用户重新登陆才能生效,而是用source命令,则能直接生 ...
- shell基础二十篇 一些笔记
shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...
- shell基础二:查找技巧,find及xargs的使用
2019独角兽企业重金招聘Python工程师标准>>> 使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的 (在有些操作系统中只允许- e ...
最新文章
- ruby gems列表
- 网络营销外包——网络营销外包专员对网站标题修改都是有原因的
- word2010忽然无法撤销
- lru页面置换算法_C|内存管理|从LRU王国到NRU王国
- [Leedcode][JAVA][第124题][二叉树中的最大路径和][递归][二叉树]
- html section 布局,section标签的用法
- Prim和Kruskal求最小生成树
- 老码农的Java干货资源
- 机器学习实战6-sklearn训练决策树实现分类和回归
- I2C总线串行串行输入输出结构
- sql for xml path用法
- 每天进步一点点——mysql——Percona XtraBackup(innobackupex)
- 模拟电子技术基础第五版习题 视频讲解 模拟电子技术基础第五版答案
- 常见的9种前端跨域解决方案详解
- MFC Windows 程序设计[十六]之小小计算器
- 抽象代数之可解群的子群是可解群以S4为例
- 判断上三角矩阵--C语言
- 高等数学张宇18讲 第一讲 高等数学常用基础知识
- 坐标计算机在线,公路坐标计算系统免费版
- 2020山西农业大学计算机排名,山西农业大学排名第几
热门文章
- python获得用户输入的一段文字将这段文字进行垂直输出_Python练习题2020
- java程序当当网购书系统怎么运行_Java实现基于控制台的购书系统基本操作
- 燕十八 mysql_布尔教育燕十八mysql优化视频课件源码分享
- oracle中匹配函数怎么用,Oracle中的正则表达式(及函数)详解
- Cynthia问题、任务、缺陷管理系统
- python四种抽样方法的使用:随机抽样、聚类抽样、系统抽样、分层抽样
- Nginx图片服务器访问图片404
- 失去jQuery Bloat —使用NodeList.js进行DOM操作
- 时间在流逝——上还是不上大学?
- txt文件编码批量转换器 2.11 官方版