......接上文
硬链接和软连接 (符号链接)
硬链接
硬链接文件可以理解为文件的副本(可以理解为复制粘贴)
ln 根据Linux系统分配给文件的inode(ls -li)号进行建立,没有办法跨越文件系统
格式:ln 被链接的文件(源文件) 生成链接文件的名字(目标文件(自定义))
通过ls -li 命令查看inode号
特点:
- 硬链接属性是 - 相当于生成一个副本 起别名
- 源文件删除,链接文件仍然存在,
- 删除源文件后即使创建一个和源文件同名文件,也和硬链接文件之间不存在链接关系
- 修改其中一个文件内容,另一个文件也会更改
- 硬链接文件和源文件拥有相同的inode号
软连接
理解为windows下的快捷方式
ln -s 利用文件路径来创建,最好是从绝对路径开始
格式:ln -s 被链接的文件(源文件) 生成链接文件的名字(目标文件(自定义))
特点:
- 软连接文件属性是l 相当于快捷方式
- 修改内容都变化
- 软连接文件可以连接目录
- 源文件删除,链接断开,重新在原位置创建同名文件,即可重新链接
- 拷贝目录的软连接可以直接拷贝,如果需要拷贝普通文件的软连接文件,需要加-d保证参数可以存在链接属性
cp -d 软连接文件(普通文件)路径
软连接和硬链接的区别
首先,从使用的角度讲,两者没有任何区别,都与正常文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行
本质区别:
硬链接:本质上是同一个文件
软连接:本质上不是同一个文件
跨设备区别:
硬链接:不支持
软连接:支持
inode区别:
硬链接:相同
软连接:不同
连接数:
硬链接:创建新的硬链接,连接数会增加,删除硬链接,链接数减少
软连接:创建或删除,链接数不会变化
文件夹:
硬链接:不支持
软连接:支持
压缩和解压
gzip和gunzip
特点:
- 只能对单个的普通文件压缩或解压
- 不能进行归档,压缩或解压后源文件不存在
- 压缩后生成的压缩格式为.gz格式
命令:压缩: gzip 文件名 ---->默认生成:文件名.gz 的压缩文件
解压: gunzip 文件名.gz ---->默认解压为 文件名
bzip2和bunzip2(特点和gzip相似)
压缩后生成压缩格式为.bz2 的格式
压缩:.bz2 文件名 -----> 默认生成:文件名.bz2 压缩文件
解压: gunzip 文件名.gz ---->默认解压为 文件名
xz和unxz (特点和gzip相似)
压缩后生成压缩格式为.xz 的格式
压缩:.xz 文件名 -----> 默认生成:文件名.xz 压缩文件
解压: unxz 文件名.xz ---->默认解压为 文件名
zip和unzip
zip命令用于将一个或多个文件压缩成单一的压缩文件 .zip
注意:
1)具有归档功能,并进行压缩
2)可以压缩文件夹,后缀为.zip。压缩文件夹需加-r
3)压缩或者解压后源文件依然存在
压缩:zip 压缩文件名 要压缩文件列表
解压:unzip 压缩文件名
tar
选项:
-c:创建一个新的归档文件
-v:显示归档和释放的过程信息
-x:释放归档文件
-f:用户指定归档文件的文件名
-t:列出tar归档文件中包含的文件或目录
-j:由tar生成归档,然后由bzip2压缩 .bz2
-z:由tar生成归档,然后由gzip压缩 .gz
-J: 由tar生成归档,然后由xz压缩 .xz
格式:
tar 选项 压缩文件名 要压缩的文件列表
压缩组合:(*表示文件列表,压缩谁写谁)
tar -cvjf file.tar.bz2 *
tar -cvzf file.tar.gz *
tar -cvJf file.tar.xz *
注:tar -cvf file.tar * ----->只归档不压缩
解压:tar -xvf xxx.tar.压缩格式
注意:
1)具有归档功能,并通过选项可以进行压缩或解压
2)压缩或解压后源文件存在
3)需要写全压缩或解压的文件名格式:
压缩文件名.tar.压缩格式
压缩
解压:
归档:
tar -tf 压缩文件名 :查看压缩文件中的内容
shell脚本编程
shell ---- > 解析器:sh ksh csh bash
shell 命令--->shell解析的命令
shell脚本---->命令的有序集合
shell脚本编程:将shell命令结合一些按照一定的逻辑集合到一起,写到一个.sh文件中实现一个或多个功能,脚本文件不需要编译可以直接执行
解释型:python 脚本
编译型:c c++ java 汇编语言
写shell脚本文件的步骤:
- 创建一个脚本文件 touch ++xxx++ ++.++ ++s++ ++h++
- 编辑脚本的内容 vi ++x++ ++x++ ++x++ ++.++ ++s++ ++h++
- 执行脚本文件
- bash ++x++ ++x++ ++x++ ++.++ ++s++ ++h++
- 直接运行脚本 需要先更改权限 chmod 777 ++x++ ++x++ ++x++ ++.++ ++s++ ++h++ 再运行 ./xxx.sh
shell变量
shell中允许建立变量存储数据,但是不支持数据类型
(如:整型、字符、浮点类型),所有赋值给变量的值都解释为一串字符。
变量的定义格式:
变量名=值
注:等号两边不能有空格
取变量的值:$变量名
变量的分类
系统的环境变量 env或者printenv
系统配置好的,内置的变量
export 变量名=值 临时终端有效
永久生效只需要将这个命令放到家目录下的.bashrc中,当前用户有效。
若放到/etc/bash.bashrc 这个文件中所有用户永久生效
自定义变量
变量的格式
变量名=变量的值`
`变量名='变量的值'`
`变量名="变量的值"`
`=两侧不能有空格`
`''内不能用$展开变量的值`
`
修饰变量的关键字:
unset 变量名 :清空变量的值,不能清空readonly修饰的变量
readonly 变量名:只读变量,值不能修改
位置 变量
$0 ---> 脚本名
$1-$9 ----> 获取第1到第九个命令行参数(外部参数)
${n} --->n:大于等于10的数 获取第10个及以上的命令行参数(外部参数)
$# ---> 获取所有外部参数的个数,不包含脚本名
\*或者@ ----> 获取所有外部参数不包含脚本名
预定义变量
$? :获取的是上一句命令是否是正确的执行结果
0:为真 非0:为假
:获取当前脚本的进程ID ##### **shell中的语句** 1.功能性语句 以#开始到该行结束,不被解释执行(即注释) #!/bin/bash 告诉操作系统是使用那种解析器执行的脚本文件 2.结构性语句 任意的shell命令、用户程序或其它shell程序 3.说明性语句 条件测试语句、多路分支语句、循环语句、循环控制语句等 ###### **功能性语句** **1.read** **(类似C语言中scanf)** 从终端获取值赋值给变量 格式:read 变量名1 变量名2 加提示语句:read -p "提示字符串" 变量名1 变量名2 补充: read -s 变量 ---\> 输入的信息不回显 read -t 秒数 变量 ---\> 如果用户n秒不输入,就结束输入向后执行语句 read -n 个数 变量名 ---\> 如果输入n个字符,自动停止 **2.shell中的运算** shell本身不擅长运算,需要借助于运算符和其他的指令 **1)expr** 使用方法: 1. expr中使用变量,必须加$ 2. 如果想要接收expr的结果,必须使用命令置换符 3. expr中运算符两侧必须有空格 、不支持自增和shell中的幂运算 4. expr中使用某些运算符是,需要转义 \|、\>、\<、\*、(、)... 5. expr指令的结果,直接回显到终端上,可以使用命令置换符接收 ![](https://i-blog.csdnimg.cn/direct/f13a5eb5b5d34e55884953e9fb707c0b.png) **expr 可以进行字符串运算** ``` match 字符串 表达式` `substr 字符串 偏移量 长度` `index 字符串 字符` ` 返回字符在字符串中第一次被查找到时的下标,下标从1开始` `length 字符串` ` 字符串的长度` ` ``` ![](https://i-blog.csdnimg.cn/direct/2ac53abc1f2048788bc2bf95331aa71f.png) **2** **)** **let** 使用方法: 1. let 变量名=表达式 2. let运算时,运算符两侧不能有空格 3. let中使用变量时,可以加$也可以不加 4. 如果直接写成**let 表达式** ,表达式会运行,但是没有办法接收 ![](https://i-blog.csdnimg.cn/direct/084b7060ca4242fcb4f1523fd76889ff.png) 未完待续......