shell编程和部分linux高级指令

一 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配置自动补全一些信息

扫描二维码关注公众号,回复: 14417959 查看本文章
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.  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号验收

猜你喜欢

转载自blog.csdn.net/m0_52592798/article/details/125952300