shell编程和部分linux高级指令

简介: 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配置自动补全一些信息
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号验收


相关文章
|
1天前
|
存储 缓存 Java
Linux常用指令和知识(1)
Linux常用指令和知识(1)
8 0
|
2天前
|
人工智能 Java Shell
【Linux】环境变量及相关指令
【Linux】环境变量及相关指令
|
2天前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
2天前
|
存储 监控 Unix
【Linux 系统】Linux 下基本指令 -- 详解
【Linux 系统】Linux 下基本指令 -- 详解
|
3天前
|
Shell Linux
【linux课设】自主实现shell命令行解释器
【linux课设】自主实现shell命令行解释器
|
3天前
|
Linux 开发工具
linux sudo指令提权
linux sudo指令提权
|
3天前
|
存储 Unix Linux
linux权限管理以及shell
linux权限管理以及shell
|
3天前
|
算法 Unix Linux
Linux基本指令总结(二)
Linux基本指令总结(二)
|
3天前
|
Linux C语言 Windows
linux基本指令总结--文件和目录(一)
linux基本指令总结--文件和目录(一)
|
4天前
|
运维 Linux Shell
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统
day02-Linux运维-系统介绍与环境搭建_硬件 系统核心 解释器shell 外围操作系统