一 linux高级命令
1.安装软件
(1)ubuntu deb
(2)redhat rpm
软件包的格式:
sl _3.03 -17 build2_amd64 .deb 软件名 主版本号 修订版本号 架构(64位) 后缀
sudo dpkg -i 软件名 sudo dpkg -l //列举ubuntu上安装的所有软件 sudo dpkg -L 软件名 //列举这个软件相关的所有路径(帮助文档,man手册,软件安装的位置信息等) sudo dpkg -s sl //查看软件的安装的状态(详细)
在线安装apt-get,如果软件有依赖程序,这些程序会被一并安装上去
选择软件源:
software & updates -> download from-->选择软件源 sudo apt-get update //更新源 /etc/apt/source.list //记录源的路径 /var/lib/apt/lists //这个服务器上的各个安装包的信息的目录
下载安装
sudo apt-get install 软件名 sudo apt-get remove 软件名 //卸载 sudo apt-get source 软件名 //下载软件的源码 sudo apt-get download 软件名 //下载软件,不进行安装(当前目录下) sudo apt-get clean //清除目录下 /var/cache/apt/archives的安装包
2.压缩命令
(1)压缩的对象是文件
ubuntu上压缩文件的格式:.gz .bz2 .xz
gzip/gunzip --->xxx.gz bzip2/bunzip2 --->xxx.bz2 xz/unxz --->xxx.xz
压缩率:.xz > .gz > .bz2 压缩速率:.xz < .gz < .bz2c
如何使用?
gzip +文件名
注意:压缩和解压缩源文件被替换
(2)归档的对象是目录(打包、拆包)
将一个目录归档成一个文件,或者将这个归档后的文件重新释放变成一个目录都是用如下命令: tar 命令 -c:创建归档文件 -x: 释放归档文件 -z: 压缩成gzip格式 -j: 压缩成bzip2格式 -J: 压缩成xz格式 -v: 显示过程 -f: 后面跟的是文件的名字
1 归档
tar -cvf hello.tar hello --->将hello打包成hello.tar tar -xvf hello.tar --->将hello.tar拆成hello目录
2.打包并压缩
tar -czf hello.tar.gz hello tar -cjvf hello.tar.bzip2 hello
3 解压缩
tar -xjvf hello.tar.bzip2 //只能解压缩.bzip2格式 tar -xvf 压缩包 //万能拆包命名
4 在拆包和解压缩的时候指定路径
tar -xvf -C 压缩包
3 文件相关
(1)文件查看
ls cat(-n:显示行号) //查看当前ubuntu的版本号 cat /etc/issue vim—>使用vim配置自动补全一些信息 vim /home/jsetc/.vim/snippets/c.snippets hdr + tab -->文件介绍 funh + Tab 函数的注释 Inc + Tab 补全头文件 main + Tab 补全main函数
head:显示前些行的命令
head 文件名 默认显示文件的前10行 head -line 文件名 显示前line行
tail:显示后些行命名
tail 文件名 显示文件末尾的10行 tail -line 文件名 显示后line(行号)行
more/less 文件名 查看文件,但是在工作中不用
file 文件名 查看文件的格式
file a.out
ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9567f9a28e66f4d7ec4baf31cfbf68d0410f0ae6, stripped
练习:
/etc/passwd 保存用户信息的文件 /ect/shadow 保存用户密码的文件 使用上述的任意命令,显示/etc/passwd文件的第41行的内容 |:管道符 --》将一个命令的结果作为后一个命令的输入 cat -n /etc/passwd |tail -4|head -1
(2)文件的追加
>:重定向 >>:追加 echo "字符串" 将字符串在终端显示 echo -n "字符串" 将字符串在终端显示不换行
(3) 文件的统计
wc 文件名 hello worldjsetc@linux:~/jsetc/214+215/day9$ wc 1.c 2 6 37 1.c 行号 单词的个数 字符的个数 wc -l 1.c //行号 2 1.c wc -w 1.c //单词的个数 6 1.c wc -c 1.c //字符的个数 37 1.c
(4) 文件内容的搜索
grep "想要搜索的字符串" 路径/文件名 参数 -n:显示行号 -R:递归搜索 -w:搜索的是单词 -i:忽略大小写 "^main":搜索以main开头的行 "main$":搜索以main开头的行 "^main$":搜索行只有main
(5) 文件的查找
find:查看文件 find 路径 -name 文件的名字 find ~ n -name 1.c
二 shell
(1) shell是什么?
shell:就是命令行解析器
(1)sh (2)csh (3)ksh (4)bash ->ubuntu上使用
(2) 什么是shell脚本
shell脚本是将一对命令个特有的控制语句放在.sh结尾的文件中,这个文件就被叫做shell脚本
(3) shell脚本的使用
1.文件的命名(结尾是.sh) vim 01test.sh 2.脚本的第一行 #!/bin/bash: 标识解析此脚本的shell是bash 3. 脚本文件是不需要编译的,直接由命令行解析器解析 4. 执行脚本 ./01test.sh (脚本需要有可执行权限)-->chomd a+x 01test.sh bash 01test.sh source 01test.sh 5.三种执行方式的区别 1)./执行脚本的时候需要可执行权限,而bash和source都不需要可执行权限 2)./和bash解析脚本的时候会新开子终端,在子终端中解析,将解析的结果返回到当前终端,source是直接在当前终端解析。
练习:脚本实现
1.在自己的用户主目录下新建两个子目录 subdir1 subdir2 2.将/etc/passwd文件拷贝到subdir1,将/etc/group拷贝subdir2中 3.将subdir2重命名位subdir 4.对subdir1进行打包并压缩成xz格式 5.将打包后的xz格式文件拷贝到subdir目录下 6.解压subdir目录下的压缩格式文件 7.查看subdir目录下的所有文件
(4)shell脚本中的变量
1.变量不需要定义 2.变量没有对应的类型 3.变量赋值的时候直接写=(等号前后不能有空格) 4.在shell脚本中,所有的变量被赋的值都认为是字符串 5.赋值的区别如下 var1=123 -->字符串之间不能有空格 var1='123 456' -->可以有空格 var2="123 $var1" -->可以有空格,可以调用新的变量 6.变量的引用 $var1 ${var1} 7.使用echo来打印变量 echo $var1 8.通过位置变量可以进行命令行的传递参数 $0 //脚本的名字 $1 $2....$9 ${10}...${n} //参数对应位置的字符串 $@或$* //命令行传递的所有的参数(脚本名除外) $# //命令行参数的个数 9. unset 变量名 //清除变量的值 readonly 变量 //标识这个变量是只读的
练习
通过位置变量向脚本中传入两个字符串分别赋值给var1和var2,然后将这两个变量的值进行交换后输出。
(5)shell脚本中的数组
shell脚本只有一维数组,没有多维数组 数组没有成员个数的限制
1. 数组的格式如下:
arr=(1 2 3 4 "www.baidu.com") arr=([0]=11 [5]=wer)
2. 数组成员访问方法
${arr[0]} ${arr[n]} #访问数组中的某一个成员 ${arr[@]} 或者 ${arr[*]} #访问数组中所有的成员 ${#arr[@]} 或者 ${#arr[*]} #数组中成员的个数
3.数组成员的追加
arr=(${arr[@]} "www.jsetc.com") #在数组的尾部进行追加 arr[6]="www.github.com" #!/bin/bash arr=(11 22 33 44 55 "www.baidu.com") echo ${arr[0]} echo ${arr[1]} echo ${arr[2]} echo ${arr[3]} echo ${arr[4]} echo ${arr[5]} echo ${arr[@]} echo ${arr[*]} echo ${#arr[*]} arr=(${arr[*]} "www.github.com") echo ${arr[@]} arr[7]=hello echo ${arr[@]} arr[8]=world echo ${arr[@]} len=${#arr[*]} echo $len echo "last member size = ${#arr[$len-1]}"
练习:
通过命令行输入一些字符串,将这些字符串赋值给数组,然后求数组成员的个数,打印数组所有的成员,将数组的第一个成员的值改为“hello world” ,打印数组最后一个成员的字节个数。
#!/bin/bash arr=($@) len=${#arr[@]} echo $len arr[0]="hello world" echo ${arr[@]} echo "last member size = ${#arr[$len-1]}"
(6) shell的运算
shell的运算符 算术运算符: + - * / % ** 幂运算 ++ -- ! && || < <= > >= << >> ~ | & ^ = += -= ...
shell中的变量被赋的值都是字符串,所以它不能够进行算术运算,如果向执行算术运算必须使用特殊的标识来完成。 (()) 整数运算 $[] 整数运算 expr 整数运算,字符串的运算
[1] (())如何使用
(($va1 + $var2)) ((va1+ var2)) #在(())内部变量可以有$,也可以没有$符号,在运算符前后可以加空格,也可以没有空格 sum=$((var++)) #如果要将一个表达式的结果赋值给变量,需要在(())前加$符号 tt=$((表达式1,表达式2,表达式3,...))#所有的表达式都会参与运算最后一个表达式的结果赋值给tt变量 在(())中可以做复杂的运算 for((i = 0; i < 100;i++)) { ((sum+=i)) } echo $sum #!/bin/bash var1=123 var2=456 sum=$((var1 + var2)) echo $sum ((var1++)) echo $var1 tt=$((var1++,++var2,9**2,var1++)) echo $tt echo $var1 echo $var2 sum=0 for((i = 0;i <=100;i++)) { ((sum += i)) } echo $sum
练习:
通过命令行输入数组,对数组的成员求和
[2] $[ ]如何使用
var1=12 ret=$[var1++] echo $[var1++] #s[]一定需要有变量去承接结果,如果不使用变量去接收结果,就必须使用echo输出 ret=$[var2 + var3] #在$[]里面,可以有空格,也可以没有空格,可以有$,也可以没有$ #在$[]中不允许做复杂的运算,比如for循环 ret=$[var1++,var2++,3**5] echo $ret #最后一个表达式的结果解释整个表达式的结果
#!/bin/bash var1=12 var2=13 expr $var1 + $var2 sum=`expr $var1 \* $var1` echo $sum #mul=`expr 6 \** 3` #echo $mul var3=`ls` echo $var3 linux@linux:~/day9$ cat 10-运算2.sh #!/bin/bash var1=12 ret=$[var1++] echo $[var1++] var2=13 var3=15 ret=$[var2 + var3] echo $ret :<<hello echo "hello world" hello ret=$[var1++,var2++,3**5] echo $ret
[3] expr的使用
var1=12 var2=13 expr $var1 + $var2 [1]expr在运算完之后结果会自动显示 [2]expr在使用的变量的时候,变量前一定要有$符号 [3]运输符前后要加空格,如果不加空格,会出错 sum=`expr $var1 + $var2` [4]如果要将expr的运算的结果给新的变量,需要使用置换 mul=`expr 6 \* 3` [5]expr在进行*运算的时候,如果不使用转义符号,它认为是通配符好,不能进行乘法运算 注:var1=`ls` var1=$(ls) #!/bin/bash var1=12 var2=13 expr $var1 + $var2 sum=`expr $var1 \* $var1` echo $sum #mul=`expr 6 \** 3` #echo $mul var3=`ls` echo $var3
三 通讯录
项目要求 1.通过makefile管理代码 2.各个子功能: a:添加用户(连续添加) b:查看用户(按照姓名的首字母排序) c:搜索用户(两种方式:id,用户名) d:删除用户信息 e:修改用户信息 f:退出 3.自己封装字符串处理函数 4.分文件编写 5.2022.7.28号验收