Linux第二课:LinuxC高级 学习记录day03
4、解压和压缩
1、gzip 和 gunzip
特点:
1)只能对单个普通文件进行压缩或解压
2)不能进行归档,压缩后或解压缩后源文件不存在
3)压缩生成压缩格式为.gz
命令:
压缩:gzip 文件名.c // 默认生成压缩文件:文件名,c.gz
解压:gunzip 文件名.c.gz // 默认生成文件:文件名.c
2、bzip2 和 bunzip2
特点:和gzip相同,压缩格式为 .bz2 格式
命令:与gzip相同
3、xz 和 unxz
特点:和bzip2,gzip相同,压缩格式为 .xz 格式
命令:与bzip2,gzip相同
4、zip 和 unzip
特点:
1)具有归档功能
2)可以压缩文件夹,压缩格式为 .zip
3)压缩或者解压之后源文件依然存在
命令:
压缩:zip 压缩文件名 要压缩的文件列表
解压:unzip 压缩文件名
5、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 -cvJf file.tar.xz *
tar -cvzf file.tar.gz *
解压:
tar -xvf xxx.tar.压缩格式
注意:
1)tar -cvf file.tar * // 只归档不压缩
2)具有归档功能,通过选项可以进行压缩或者解压
3)压缩或解压后源文件存在
4)需要写全压缩或解压的文件名格式: 压缩文件名.tar.压缩格式
查看:
tar -tf xxx.tar.gz
5、shell脚本编程
5.1、shell脚本
shell // 解析器:sh csh ksh bash
shell 命令 // shell 解析的命令
shell 脚本 // shell 命令的有序集合
shell 脚本编程 // 将shell命令按照一定逻辑集合到一起,写到一个 .sh 文件,实现一个或多个功能,这个脚本文件不用编译直接执行
解释型语言:脚本,python
编译型语言:C,C++,java,汇编
书写shell脚本的步骤:
1、创建一个脚本文件 // touch 文件名.sh
2、编辑脚本内容 // vi 或者 vscod
3、执行脚本文件
1)直接运行脚本
chmod 777 xxx.sh
./xxx.sh
2)bash 文件名
5.2、shell 变量
shell 中允许建立变量存储数据,但是不支持数据类型(整型,字符,浮点型),所有赋值给变量的值都解释为一串字符串。
5.1.1、变量的定义
格式:
变量名=值 // = 两边不能加空格
获取变量的值: $变量名
a=hello
b=$a
5.1.2、变量的分类
系统环境变量
// 系统配置好的,内置的变量
查看环境变量
env
printenv
expor 变量名=值 // 临时终端有效
~/.bashrc // 当前用户永久有效
/etc/bash.bashre // 所有用户永久有效
自定义变量
格式
变量名=变量的值
变量名=‘变量的值’
变量名=“变量的值”
// = 两端不能有空格
// ‘ ’ 内不能使用$展开变量的值
修饰
readonly:只读变量,值不能修改
unset:清空变量的值,不能清空 readonly 修饰的变量
位置变量和命令行参数
$0 // 可执行脚本名
$1 $2 $3 …… $9 // 脚本名之后的字符串
${n} // 脚本名之后的字符串,n > 10
$# // 获取所有外部参数的个数(不包含脚本名)
$* 或者 &@ // 获取所有外部参数(不包含脚本名)
预定义变量
$? // 获取的是上一条命令是否是正确的执行结果
// 0 :真,非0:假
$$ // 获取当前脚本的进程 ID
6、shell 中的语句
6.1、分类
1)说明性语句
以#开始,到该行结束,不被解释执行
2)功能性语句
任意shell命令,用户程序或其他shell程序
3)结构性语句
条件测试语句,多路分支语句,循环语句,循环控制语句等
6.2、功能性语句
6.2.1、read
// 类似scanf
功能:
从终端获取值赋值给变量
格式:
read 变量1 变量2
选项:
read -p "提示信息" 变量1 // 提示信息
read -s 变量 // 输入信息不回显
read -t 秒数 变量 // 输入限时,时限内不输入,结束输入向后执行语句
read -n 个数 变量名 // 限制输入个数,输入到一定量字符,自动停止
6.2.2、shell中的运算
shell 本身不擅长运算,需要借助于运算符和其他命令
1、expr
使用方法:
1)expr中使用变量,必须加$
2)expr本身可以直接将结果输出到终端,想接收expr的结果,必须有命令置换符` `
3)expt 中运算符两侧必须有空格,不支持自增和幂运算
4)expr 中使用某县运算符时,需要转义\ : ( ) | > < ...
expr可以进行字符串运算:
expr match ”字符串“ 表达式(“字符串”)
expr match "hello world" "hello" // 返回:5
expr match "hello world" "llo" // 返回:3
// 表达式在字符串中的第一个位置完全匹配,返回匹配字符个数,不能完全匹配返回值为0
expr substr “字符串” 偏移量 长度
expr substr “hello world” 7 5
// 从字符串开头数偏移7个字符,然后从第7个位置截取5个字符
返回:world
expr index “字符串” 字符
expr index "hello word" e 返回:2
// 返回字符在字符串中第一次被查找到时的下标,下标从1开始
expr index "hello word" le 返回:2
// 如果查找多个字符在字符串的位置,返回最先出现的字符下标
expr length “字符串” // 返回字符串的长度
2、let
使用方法:
1、let 变量名=表达式
2、let 运算时,运算符两侧不能有空格
3、let 中使用变量时,可以加$也可以不加
4、如果直接写成 let 表达式,表达式可以运行,但是没法接收
5、let 可以自加(与C语言相同)
3、test
test 语句可以测试三种对象:字符串,整数,文件属性
字符串测试
符号两侧必须有空格,没有返回值
s1 = s2 // 测试两个字符串的内容是否完全一样
test “hello” = "world" // 相等为真,不等为假
s1 != s2 // 测试两个字符串的内容是否存在差异
test “hello” != "world" // 相等为假,不等为真
-z s1 // 测试字符串的长度是否为空
test -z "" // 空为真,非空为假
-n s1 // 测试字符串的长度是否不为空
teat -n "hello" // 空为假,非空为真
整数的测试
a -ep b // 测试 a 和 b 是否相等 equai
read A B
test $A -eq $B
echo $? // 如果两个数相等则为真,反之为假
a -ne b // 测试a 和 b 是否相等
test $A -ne $B // 相等为假,不等为真
a -gt b // 测试 a 是否大于 b
test $A -gt $B // a > b为真,a不大于b为假
a -ge b // 测试 a 是否大于等于b
a -lt b // 测试 a 是否小于 b
a -le b // 测试 a 是否小于等于 b
文件属性测试
-d name 测试 name 是否为一个目录
test -d $FILE // 是目录为真,在当前目录找
-f name // 测试 name 是否为一个普通文件
-e name // 测试name是否存在
补充:
FILE1 -nt FILE2 1的时间戳比2的更新
FILE1 -ot FILE2 1的时间戳比2的更旧
-b FILE 文件存在且是一个块设备文件
-c FILE 文件存在且是一个字符设备文件
-d FILE 文件存在且是一个目录设备文件
-f FILE 文件存在且是一个普通文件
-e FILE 文件存在
-h 或者 -L FILE 文件存在且为软链接文件
-s FILE 文件存在且大小不为0
-S FILE 文件存在且是一个套接字文件
-p FILE 文件存在且是一个管道文件
-w FILE 文件存在且有可写权限
-r FILE 文件存在且有可读权限
-x FILE 文件存在且有可执行权限