python全栈-shell编程
Shell编程
- cat /etc/shells 查看Linuxcentos支持的shell解释器有哪些
- echo $SHELL
- echo 类似print,输出一个信息
- $SHELL 这个美元符号,加上后面的变量,就可以查看系统的默认值
- 这条语句就是输出当前系统的shell默认解释器
shell编写格式
- 首行格式#!/bin/bash
- 就是指定shell解释器
- 创建文件的后缀是sh
- test.sh
- 单行注释,用一个#开头,后面写注释内容
- 多行注释
- 第一行:<<!
- 多行注释内容
- 结尾处!
- 创建sh文件,使用touch 文件名.sh
- 编写sh文件,使用vim 文件名.sh
创建第一个shell文件:
- 查看默认shell解释器,echo $SHELL
- 创建文件touch test1.sh
- 编辑文件vim test1.sh
- 编辑内容
- #!/bin/bash
echo “第一个shell编程”
- #!/bin/bash
- 执行sh文件,sh test1.sh
执行sh文件,就是sh+文件名.sh
执行shell文件
有三种,前两种都是使用shell解释器去运行,最后一种是直接调用系统文件
- sh 脚本文件
- bash 脚本文件
- ./脚本文件
一般来说,第三种执行方式,有执行权限的问题,我们需要提升文件的权限,使用chmod命令
一般使用第一种就够了
在shell中创建文件
我们在Linux里面执行的命令可以直接写在sh文件里面
我们在Linux里面使用touch创建文件,shell里面也可以,使用echo把配合重定向,可以把信息写入创建好的文件里面
\#!/bin/bash
touch test2.txt # 创建空文件
test2.txt echo "nihao" >> test2.txt # 将 "nihao" 写入 test2.txt
shell 变量
在 Shell 中,变量是一种用于存储数据的方式,可以是字符串、数字或其他数据类型。变量可以帮助用户存储和管理数据、设置参数、控制程序的执行流程等。下面是关于 Shell 变量的基本介绍,以及它们的作用。
输入env可以查看当前系统所有环境变量
使用set可以查看所有环境变量,包括系统变量
Shell 变量的类型
用户定义变量:
这些是用户创建的变量,通常由字母、数字和下划线组成。例如:
my_var="Hello, World!"
环境变量:
这些是系统或用户环境中的变量,可以在整个操作系统中使用。常见的环境变量有
PATH
、HOME
、USER
等。例如:echo $HOME # 输出当前用户的主目录
LANG是当前系统语言环境
位置参数:
- 这些是由脚本或函数传递给变量的参数,使用
$1
、$2
等表示。例如,在脚本中$1
表示第一个参数,$2
表示第二个参数。
- 这些是由脚本或函数传递给变量的参数,使用
变量的作用
数据存储:
- 变量可以用于存储各种数据并在脚本中重复使用。
控制程序的执行:
变量可以影响控制结构的行为,比如
if
语句、for
循环等。例如:count=10 if [ $count -gt 5 ]; then echo "Count is greater than 5" fi
参数化脚本:
- 使用变量可以使脚本更具可复用性。通过使用位置参数,可以通过命令行向脚本传递不同的值。
信息传递:
- 变量可以在函数或脚本之间传递信息,从而使代码更具模块化。
动态构建命令:
通过变量,您可以动态构建和执行命令。例如:
filename="myfile.txt" cat $filename
变量的创建和使用
变量的语法格式和其他语言基本类似
在变量名和值,等号中间不能有空格
创建变量:
var_name=value # 无空格,例如:name="John"
访问变量:
- 使用
$
符号前缀:
echo $var_name # 输出变量的值
- 使用
导出环境变量:
- 如果希望将变量传递给子进程,可以使用
export
:
export var_name
- 如果希望将变量传递给子进程,可以使用
删除变量unset
- 在unset后面跟变量名,就可以删除该变量
示例
以下是一个简单的示例,展示了如何使用变量:
#!/bin/bash
# 定义变量
name="Alice"
age=30
# 输出变量值
echo "Name: $name"
echo "Age: $age"
字符串拼接
我们在输出变量的时候,可以直接使用美元符号加变量的形式,比如,
$a
${a}
上面这两种格式都可以输出a的值
但是第一种形式不可以使用字符串拼接,比如$a123,这是错误的语法结构
但是可以使用${a}123,可以输出a的值和后面的123
自定义常量
- 使用readonly,可以把变量定义成只读变量,也就是常量
- readonly aaa
这个自定义变量只能在定义的时候被赋值,赋值之后不可以再次修改
这个变量在文件里面不可修改,在文件外面访问的时候,也不可以修改
自定义全局变量
父子shell环境
如果有两个sh文件,a文件中用到了b文件,a就是b的父shell环境
自定义全局变量,可以在当前文件中使用,也可以在子环境中使用
- 自定义全局变量的语法:export 变量名=值
自定义系统环境变量
就是在/etc/profile这个文件里面定义的变量,就是自定义的系统环境变量
定义结束之后,需要重新加载一次这个文件,使用命令source /etc/profile
- 在刚刚那个文件里面,写export 变量名=值
- 就可以定义完了
特殊符号变量
$n | 接收脚本文件执行时传入的参数 |
---|---|
$# | 传递脚本参数的个数 |
$* | 以单个字符的格式,显示给脚本的参数 |
$@ | 与上面的一样 |
$$ | 显示脚本运行时的进程id |
$? | 显示脚本退出状态是否正常,如果是0,就是成功了,非0是失败。也可以接收函数的返回值 |
$0 | 当前脚本文件名 |
$n
向脚本文件里面传递参数
sh 脚本文件.sh 参数1 参数2 。。。。
sh test.sh 11 22 33 44
- 在脚本文件中接收参数,$0获取脚本文件名
- $1 接收第一个参数,因为我们输入了11,在文件中,11就替换了第一个参数的位置
- 同理$4是第四个传进去的参数
- 如果参数的数量大于9,我们需要用花括号括起来,即${11} 以这种方式接收第11个参数
$*和$@
在使用的时候,用法是一样的
都是以字符串的形式把参数输出
- 不同点
- 我们用双引号把这两种参数括起来
- “$*” 输出的内容是双引号括起来的"参数1 参数2 …"
- “$@” 这边的输出内容是“参数1” “参数2” 。。。。
字符串变量
单引号的字符串,不具有赋值操作,比如’a的值是$a’,这里面的a的值不会正常打印
双引号允许赋值操作,“a的值是$a”,可以把我们给a设定的值打印出来
这里面可能出现转义字符,是使用\反斜杠取消转义
如果我们想要输出一大段字符串,中间有空格,每一个空格后面的字符串内容都会被当命令去解析,为了避免这种情况,给每一个字符串尽可能的加上引号
获取字符串长度 ${#字符串变量名}
字符串拼接
- $字符串变量1$字符串变量2
- “$字符串变量1 $字符串变量2” 有引号包裹的时候,中间可以有引号
- $字符串变量1’,'$字符串变量2 在变量1的结尾和变量2的开头都有引号,引号中间可以写一些字符,起分隔的效果
使用这三种格式都可以把两个字符串拼接,一起输出
截取字符串
就是python里面的字符串,搭配序列
- ${字符串变量名:start:length}
- 从字符串的第start位开始,截取length个字符
- 如果没有length,就是从开始的位置一直截取到最后
- 如果start是负数的话,就是从右往左数,截取最后几位。需要0-start这种格式,不可以是-start
- 当start是负数的时候,length的长度大于负数的绝对值,也不会超出字符串的内容,和没有length的效果一样
- ${变量名#*chars}
- 从左边开始,第一个chars的位置截取后面的所有字符
- ${变量名##*chars}
- 从左数,最后一个*chars出现的位置开始向右截取
- ${变量名%*chars} 就是从右数第一个
- ${变量名%%*chars} 从右数最后一个
数组
shell里面只支持一维数组,不支持多维数组
数组类型不限,数组大小不限,下标从0开始
定义数组
array_name=(value1 value2 value3 value4 …)
使用空格分开每个元素
也可以不连续给变量赋值
array_name=([0]=value1 [4]=value2 [7]value3 [11]value4 …)
数组操作
- ${arr[0]} 需要使用花括号括起来
- ${arr[@]} ${arr[*]} 这两种方式都可以直接获取数组的所有元素
- ${#arr[@]} ${#arr[*]} 在上面的数组名前面加个#号,就可以获取数组的长度/个数了
- ${#arr[0]} 获取数组第0个元素的字符长度
数组拼接new_arr=(${arr1[@]}${arr2[@]}…)
删除数组
- unset 数组名[下标] 制定了数组的下标,就是删除这个元素
- unset 数组名 没有指定下标,就是删除整个数组
shell内置命令
- tpye 命令
- 一般有两种返回类型:
- 一种是shell内嵌
- 一种是文件路径 如果是文件路径就是文件
文件路径也能当命令使用,但是使用这个命令之前,需要调用磁盘io接口,才可以调用,速度要比内置命令慢一些
- 常用内置命令
语句 | 作用 |
---|---|
alias | 给命令起别名 |
echo | 将字符串输出到终端 |
read | 读取数据给变量 |
exit | 强制退出 |
declare | 声明一个变量或者变量类型 |
alias 别名=‘命令语句’
- 给命令起别名,就行’ll‘是‘ls -l --color=auto’的缩写一样
- 直接输入alias就可以看到所有的别名命令
unalias 别名
- 就是删除别名
echo -n 字符串
- 有了参数n,就不会自动换行了,会把下一条语句紧贴本行的字符串后面
- -e 这个也是参数,没有e的时候,不可以使用转义字符,比如\n。有了参数e,才可以使用
read [参数] [变量]
没有参数和变量,read将把用户输入的内容放在环境变量REPLY里面,我们使用$REPLY获取到输入的信息
如果只有变量名,read将把输入的内容传给变量,我们使用echo打印变量,可以看到输入的信息
-
选项 作用 -a 把读取到的数据赋值给数组,从0开始 -n 读取n个字符,不是整行字符。自动获取n个字符,当拿到n个字符之后,自动执行后面的命令 -p 显示输入的信息 -s 静默输入,就像输密码一样,看不到输入的内容 -t 等待时间,避免等待用户输入的时间过长 read -p ‘提示信息’ 变量
- 这条语句,就向input一样,前面的提示信息,是提醒用户的。后面的变量来接收输入的值
read -n 2 -p ‘提示信息’ 变量
- 获取到两个字符之后,就赋值给变量
exit
- 用来退出当前的shell脚本
- 同时返回一个状态码,使用$?可以接收
- 退出状态码只能在0~255之间
- 只有0是成功退出的意思
declare [+/-] [参数] [变量名]
-是设置属性
+是取消设置
-f 列出函数体函数名
-a 声明变量是普通数组
-A 变量是关联数组,数组元素是键值对,可以访问键,获取值
- 普通方式不可以创建关联数组,普通方式创建的数组,在执行的时候,只能访问最后一个键值对的值。就是访问所有的键,都只能拿到最后一个值
-i 整型
- 只有变量被声明成整型,才可以进行算术运算
-r 只读
- delare -r pi=3.14 类似定义常量
-x 全局变量
shell运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 文件测试运算符(shell独有的运算符)
原生shell不支持数学运算,需要使用expr命令实现
expr只支持整数运算
- 语法:expr 算术运算表达式
- 在算术表达式前后需要有一个空格
- 获取结果的表达式:result=`expr 算术表达式`
- 需要使用反引号括住
算术运算符
加法
- expr 10 + 10 输出20
- expr 10+10 输出10+10,没有正常计算
- result=`expr 10 + 10`
减法和加法一样
乘法,因为*是转义字符,需要取消转义,即 \*才可以使用
其他的用法一样
一个等号是赋值,等号两边不能有空格
两个等号是比较,需要有空格,判断不等,也要两边加空格
比较运算符
运算符 | 作用 |
---|---|
-eq | 判断相等== |
-ne | 不相等!= |
-gt | 大于> |
-lt | 小于< |
-ge | 大于等于>= |
-le | 小于等于<= |
如果是的话,返回0。否则返回1
也可以直接使用==<>
使用运算符的时候:
- 使用命令:[ a -eq b ] 必须有空格
- 使用等号:((a==b)) 需要有两圆括号,等号两边可以有空格,也可以没有
字符串比较运算符
可以比较字符串,也可以比较整数和小数
可以使用两个中括号,或者一个中括号里面
运算符 | 作用 |
---|---|
==或者= | 都可以判断相等 |
!= | |
< | 使用一个中括号的时候需要使用反斜杠,反转义。两个中括号就不用了,也不能使用反斜杠 |
> | 和小于的规则一样,[ a \< b ],[[a < b]] |
-z | 返回字符串长度,空字符串是0 |
-n | 判断字符串是否不为空,不空就返回0.[-n “$a”] |
$ | 字符串不空,就返回0,[$a],和-n一样 |
两个中括号,即可以比较字符串,也可以比较整数小数
两个圆括号,只能比较整数
使用一个中括号来比较字符串的时候,不允许任何一个字符串中间有空格,如果有空格就会报错,提示参数太多。
使用两个中括号可以避免这个问题
布尔运算符,一个中括号
! | 非 [!a] |
---|---|
-o | 或[a -o b] |
-a | 与[ x -a y ] |
逻辑运算符,两个中括号
- && 与
- || 或
文件测试运算符
检查文件,是否存在,可读,可执行,为空,可写,为目录,为普通文件
-d | 目录 |
---|---|
-f | 普通文件 |
-r | 可读 |
-w | 可写 |
-x | 可执行 |
-s | 为空 |
-e | 是否存在 |
是的话,返回true
计算命令
(()) | 用于整数运算 |
---|---|
let | 和(())类似 |
$[] | 不如(())灵活 |
expr | 比较麻烦,需要注意各种转义 |
bc | 处理整数和小数 |
expr
- expr length 字符串 返回字符串长度
- expr substr 字符串 start len 截取字符串,和之前的数组用法一样。这里是从1开始
- expr index 字符串 字符 返回第一个字符在字符串的下标
- expr match 字符串 正则表达式 返回符合表达式的字符长度,hello.* 返回以hello开头的字符串长度
- expr 字符串:正则表达式 和上面的一样
(())
进行数学运算。把表达式放在括号里面就可以了。使用$ 可以得到结果。在括号里面可以任意添加空格
- ((a=10+9))
- a=$((10+9))
- ((a=10+5,b=a-6)) 可以多个表达式一起运算
- ((a>3 && a<7)) 条件判断
let 表达式
和双括号以及expr的功能一样,只能用于赋值和运算,不可以判断和直接输出
可以一个let关键词后面跟着一堆表达式
$[表达式]
和let类似,但是只能对单个表达式计算与输出
bc [选项] [参数]
可以进行进制转换。
可以进行基本的算术运算,加减乘除,指数,取余等等
- 选项:
- -l 使用内置函数
- -q 去掉提示信息
直接输入bc开启计算器
[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
这一大堆都是提示信息,我们只需要在刚刚的bc后面加上参数-q就可以不显示这些信息了
进入bc环境之后,就是一个计算器了,我们输入表达式10+20,然后回车就可以得到结果,其他的算术运算也是一样的
- scale=n;表达式 n是保留的小数位数
- 不写scale的时候,哪怕表达式的计算结果有小数,也不显示,有了这参数,可以看到小数了
- ibase=n; 指定输入的数字的进制,默认是十进制
- ibase=2;110 就是6 .是把二进制的表达式,转换成十进制的结果
- obase=2; 10
- 是把十进制的表达式,输出为2进制的格式
- last或者.
- 输出最近一次表达式计算的结果
因为我们打开了bc环境之后,一次只能进行一个表达式运算。我们可以提前把多个表达式写在文件里面,使用bc命令去执行
- bc -q test.txt
- 首先是把txt文件的表达式算出来,然后进入了bc环境
- quit 退出bc环境
bc内置数学函数
想要使用这些内置函数,需要在调用bc命令的时候加参数-l再进入bc环境,即bc -l
- s(x) 计算正弦
- c(x) 余弦
- a(x) 反正切值
- l(x) 计算x的对数
- e(x) 求e的x次方
- j(n,x) 贝塞尔函数,计算n到x的阶数
bc非互动式执行
刚刚我们使用bc的命令,都是进入的bc环境,进入bc环境就是互动了。
我们也可以不进入bc环境,还能使用bc的语法
- echo “表达式” | bc 参数
- 写了-l参数,才可以使用内置函数
- 表达式就是刚刚在bc环境里面运行的表达式
使用这种方式可以不进入bc环境
获取bc的计算结果
- 正常的bc表达式:echo “10+20” | bc
- 获取他们的值:
- result=`echo “10+20” | bc` 使用反引号直接括起来
- result=$(echo “10+20” | bc) 使用美元符号和小括号,也能获取计算的结果
非互动式获取多行表达式结果
我们可以在不编辑文件的前提下,也能编辑多行表达式
result=`bc 参数 << EOF
第一行表达式
第二行表达式
。。。
EOF
`
方式二:
result=$(bc 参数 << EOF
表达式1
表达式2
。。。
EOF
)
使用echo可以一次性输出所有表达式的计算结果
输出结果:echo $result
控制语句
if 条件语句
- 单分支
结构:
if 条件表达式then # 如果条件成立就执行then后面的语句
语句1
语句2
fi 需要使用fi结尾,结束这个if的判断
如果语句比较短,可以简写成一行
if 条件表达式;then 命令语句; fi
- 注意里面的两个分号
多分支判断语句
结构:
if 条件语句
then
条件成立的语句
else
条件不成立的语句
fi
也可以单行使用
- if 条件表达式;then 成立的语句;else 不成立语句;fi
if 条件表达式
then
语句1
elif 条件表达式
then
语句2
else
语句3
fi
有if判断的语句后面需要跟一个then
这里面的if也可以嵌套,把if写在语句的位置就可以了
test命令
用于测试条件是否成立
返回值是布尔值,适合作为if的表达式
测试类型包括数值,字符串,文件
- if + test + shell运算符表达式
case语句
case…esac结尾
用法类似switch。。case
case $aaa in
正则表达式1) 这里是正则表达式,如果值能匹配上就执行下面的语句
语句1
;; 两个分号,类似break
正则表达式2)
语句2
;;
正则表达式3) 正则表达式可以是数字,也可以是字符串
语句3
;;
…
*) 星号是可以匹配任意内容的,也就是说,上面的正则表达式都没匹配上,最后这个星号也能接收
语句n
;;
esac case语句的结尾
while语句
while 循环条件
do 循环体开始
循环体语句
done 循环体结束
#!/bin/bash
i=1
sum=0
while ((i<10))
do
sum=$((sum+i))
i=$((i+1)) 就是i自增
done
echo $sum
这是一个累加程序
如果遇到了无限循环,可以使用CTRL+c,结束
我们在设计循环的时候,也可以使用break和continue
until 语句
和while语句完全相反,是条件不成立则循环
until 语句 === while !语句
for 循环
for i in [序列]
do
循环体
done
- 也可以简化序列
for i in {start…end} 必须是整数格式,从开始到结束的序列
do
循环体
done
- C语言版的循环
for((i=start;i<=end;i++)) 注意双括号
do
循环体
done
select 循环语句,shell独有
会把in后面的内容制作成选项,选项前面带有编号,输入编号就是选择相应的内容
适合有交互的场景
#!/bin/bash
echo “您最喜欢的季节是什么?”
select i in “春” “夏” “秋” “冬”
do
echo “您最喜欢的是:${i}”
break 必须有这个break,不然会一直困在这个循环里面
done
- 执行示例
[root@localhost ~]# sh test1.sh
您最喜欢的季节是什么?
- 春
- 夏
- 秋
- 冬
#? 1 这里是我手动输入的1
您最喜欢的是:春
[root@localhost ~]#
shell函数
系统函数
- basename [路径] [后缀]
如果使用basename+路径,就会把文件名打印出来
如果使用的是basename+路径+文件名的后缀,会打印不包含文件后缀的文件名
- dirname 绝对路径
使用这个命令,可以从绝对路径中拿到文件的目录路径。就是绝对路径的上级路径
自定义函数
格式:
[function] funname [()]{
函数体;
[return int;]
}
中括号里面的都是可有可无的
function test1(){
echo "test1"
}
test2(){
echo "test2"
}
test1
test2
- 传参:把参数写在函数名后面就可以
#!/bin/bash
test1(){
echo "1:$1"
echo "3:$3"
echo "2:$2"
echo "6:$6"
}
test1 11 66 33 99 55 你好
没有参数类型的限制
- $$ 查看进程id,这里的id类似地址,函数也有id,文件也有id
基本概念
- 标准输入
从键盘输入的就是标准输入
- 标准输出
输出到屏幕上的内容,就是标准输出
- 输入输出重定向
把本来该往屏幕上打印的输出,流向其他地方,比如文件,等等,就是输出重定向
从除了键盘外的地方输入进来的数据就是输入重定向
- 输入重定向
经常与wc命令配合使用
wc的参数:
- -c 字符数量
- -w 单词数量
- -l 行数
- wc -c << test.txt 统计test文件的字符数量
文本处理工具
grep 文本搜索工具
在一个文件或者多个文件中搜索含有关键词的行
- 格式:grep [参数] ‘关键字’ 文件命
- 参数:
- c 输出行数,含有关键词的行有几个
- i 不区分大小写找关键词
- v 显示不含关键词的所有行
- w 按单词搜索
- o 打印匹配关键词,就是关键词出现几次,就打印几次
- A after显示匹配行以及后面的几行
- B before显示匹配行以及前面的几行
- C 显示匹配行前后几行
- n 显示匹配行及行号
- ^key 以关键字开头
- key$ 以关键字结尾
- ^$ 匹配空行
cut 按列切分文本
格式:cut [参数] 文件
- 参数:
- f 列号,因为是按列去获取内容,第二列可以是单字符,可以是长字符串
- c 以字符为单位分隔
- b 以字节为单位分隔,因为是按字节去获取内容,如果当前字节是中文,就无法获取。因为中文不能拆开
- d 自定义分隔符
- n 与b连用,不分隔多字节,因为中文一个字符占好几个字节,算是保护汉字
- 提取范围:
- n- 从第n行及后面
- n-m 第n行到第m行
- -m 从开头到第m行
- n1,n2… 指定行
- 示例:cut -d " " -f 2 test.txt
- 提取test文件中第2列的所有内容,以空格分开
- 示例:cut -d " " -f 2,5 test.txt
- 获取第2列和第5列的字符串,因为是按列去获取内容,第二列可以是单字符,可以是长字符串
sed文本编辑器
就像记事本一样,对文件增删查改都可以,还能按行按列,正则表达式去使用
格式:sed [参数] [匹配模式|sed程序命令] [文件]
参数:
- r 使用正则表达式
- i 直接对文件进行修改,如果不加这个参数就不能对文件修改
命令:
- a 追加在匹配行后面
- c 更改
- d 删除
- i 插入,在匹配行前面
- s 替换每行的第一个关键词
- p 打印
- = 显示行号
- n 读下一行
- r,w 读写操作
示例: sed -i ‘3a你好’ test.txt
- 在test文件的第三行后面,也就是第四行追加字符串‘你好’
- 没有i的话,不能修改源文件
示例:sed ‘/hello/chi’ test.txt
- 第一个斜杠后面是要匹配的关键字
- 第二个斜杠后面的第一个字符,就是我们的命令,这里是c,也就是更改
- 在命令后面是要替换的字符串,也就是把文件中hello的字符串改成hi
awk文本分析
格式:awk 选项 ’命令‘ 文件
选项:
-F 指定分隔符,不写是空格
-v 定义用户变量
命令:
- $n 第n行
- $NF 最后一列
- ARGC 参数的个数
- ARGV 包含参数的数组
- NR 行号
print和printf
print类似echo,换行输出
printf 是echo -n,不换行输出,可以使用占位符%s%d
- %15s 表示占15个字符空间的字符串,右对齐
- %-12d 表示占12字符空间的数值,左对齐
BEGIN。。。END
用法:`‘BEGIN{想要先处理的内容};{正常处理的内容};END{之后处理的内容}’`
sort [参数] 文件
以行为单位对文本排序
从每一行的第一个字符开始,按照ascll码值比较大小.升序输出
- 选项:
- u 如果有相同的行,就删除,只留一个
- r 降序输出
- o 配合重定向,把排序后的内容写入源文件
- n 按数值大小排序,因为是默认按字符排序,10和2的首字符是1和2,排好序,10在2的前面
- t 指定分隔符,把原来的一行字符串,拆成小段
- k 指定段排序,按第k段排序
tee [参数] 文件
类似重定向,但撒不太一样.
既输出到屏幕,也能输出到文件,相当于是拷贝一份到屏幕
- 参数:
- a 追加,没有a参数,就是覆盖文件
批量修改文件名
包括修改文件后缀
- 批量创建文件 touch /file{1~10}.txt
- 创建出file1.txt file2.txt…
- 修改文件名 rename 旧文件名 新文件名 旧文件路径/* 一定要有*号