Linux程序设计环境

294 阅读8分钟

一入终端深似海,从此妹子是路人。妹子神马的从今天起雨我无瓜。 --2021.4.12

入门介绍

命令行用户界面

命令提示符

[xiemenghang@localhost ~][用户名@机器名工作目录]提示符提示符: [用户名@机器名 工作目录]提示符 提示符:普通用户,#root用户

常用技巧

  1. 命令历史:上下箭头显示历史命令(历史命令)
  2. 自动补全:tab键
  3. 清空屏幕:clear
  4. 退出命令行界面:exit命令
  5. man命令查看文档

用户与文件操作

文件系统介绍

Linux文件系统是一个典型的单根,分层,树形结构,系统第一级目录为根目录,“/”表示。

以字符"."开头的文件为隐藏文件,默认不显示。 目录也是文件,是一种属性不同的文件。 后缀名不是文件名称的必要元素,仅仅方便使用。

文件系统常用目录

image.png

image.png

image.png

image.png

命令

  1. 语法:pwd当前工作目录 参数:-P非链接路径

  2. 语法:which 【-a】获取命令的可执行文件的位置 参数 -a:若有多个可执行文件,列出所有。其根据环境变量的先后顺序列出(echo $PATH)

image.png

  1. 语法:ls [aAdFhlrSt]列出文件和目录 参数:

image.png

  1. 语法:cd [相对路径或绝对路径] 特殊目录:
  • .当前目录
  • ..上级目录
  • -前一个工作目录
  • ~当前用户主目录
  • ~用户名 用户名的主目录

image.png

  1. 语法:du [-aAdFhlrSt] 显示目录包含的文件大小(Disk Usage) 参数:
  • -h:以K ,M ,G方式显示大小
  • -a:显示目录大小
  • -s:显示总计大小
  1. 语法:cat 文件名 一次性显示文件内容

image.png

(yum.log位置为/var/log)

  • 缺点:全部打印所有内容,对长内容不太友好

  • 替代:

  1. less 文件名 分页显示文件内容

image.png

image.png

  1. 其他显示文件内容命令

image.png

  1. 语法:od [-t TYPE]文件 参数:
  • -t:指定输出内容
  • a:默认字符
  • c:使用ASCII字符输出
  • dox: 十进制,八进制,十六进制
  • f:浮点数输出
  1. 语法: touch 文件 新建一个空白文件,或者修改文件最后修改时间(文件已存在)

image.png

  1. 语法:mkdir [-mp] 目录名称 创建目录 参数:
  • -m 指定权限,不考虑默认权限(umask)
  • -p递归创建目录

image.png

image.png

  1. 语法:cp [-adfilprsu] 源文件 目标文件 cp[options] 源文件1 源文件2 。。。 目标文件 拷贝文件(拷贝=复制+移动!=复制)

参数:

  • -a :相当于-pdr(pdr是下面的具体参数)
  • -r :递归持续复制(例如如果拷贝一个目录到某个地方,则其不会将目录中内容一起拷贝,这时便用到-r)
  • -d :若文件为链接文件,则复制链接文件而不是文件本身
  • -i :若文件已经存在,覆盖时会进行交互
  • -p :连同文件的属性一起复制,不是使用默认属性

13.语法: rm [-fir]文件或目录 删库跑路(哈哈 哈哈哈 笑) 在服务器上不要使用此命令(很危险) 参数:

  • -f:强制删除,忽略不存在的文件,不出现警告信息 删库跑路命令: rm -f /*
  • -i:交互删除
  • -r:递归删除

用户和权限

Linux用户与用户组

用户分类

1.所有者U 2.使用者

  • 组内用户G
  • 其他用户O

用户相关文件

  • 用户账号信息 /etc/passwd
  • 用户密码信息 /etc/shadow
  • 组账号信息 /etc/group
  • 组管理及密码信息 /etc/gshadow
[root@VM-4-9-centos /]# head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

账户名称:密码(加密):UID:GID:用户信息:主文件夹:shell

image.png

[root@VM-4-9-centos /]# head -n 5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

组名称:组密码:GID:该用户组支持的账号

  • 一个新建的用户了隶属于和其同名的用户组,称为初始用户组
  • 初始用户组包含的用户不会在第四个字段列出
  • 一个用户可以隶属于多个组

账号密码管理

image.png

image.png

用户管理其他常用命令

image.png

文件权限

[root@VM-4-9-centos ~]# ls  -l
total 44
-rw-r--r-- 1 root root  1759 Jan 30 11:10 cosfs.sh
-rw-r--r-- 1 root root  1237 Jan 28 11:55 dnspod.sh
-rw-r--r-- 1 root root 25373 Mar 19 11:43 install_panel.sh
-rw-r--r-- 1 root root  2258 Mar  3 15:14 install.sh
-rw-r--r-- 1 root root  1219 Feb  5 10:40 txcdn.sh
  • -rw-r--r-- :权限字符串
  • 1:文件链接数
  • root:文件所属用户名
  • root:文件所属组的名称
  • 1759:字节数表示文件大小
  • Jan 30 11:10:最近修改时间

权限字符串:10个字符

  • 字符1:

image.png

语法:file 文件名 确定文件具体类型,即权限字符串第一字符为-时,可以用file语法查看文件具体类型

[root@VM-4-9-centos ~]# file cosfs.sh
cosfs.sh: Bourne-Again shell script, UTF-8 Unicode text executable
  • 字符2-4,5-7,8-10分别用于UGO的

针对目录权限的意义:

  1. 读(r):表示具有读取目录的权限,可以用ls命令查询该目录下的文件信息
  2. 写(w):具有更改该目录结构列表的权限。包含:创建新的文件与目录,删除已存在的文件与目录,将已存在的文件或目录进行重命名,转移该目录内的文件或目录的位置。
  3. 执行权限(x),表示能否进入该目录 cd
  4. 用-代表不具备权限

针对文件:

  1. 读(r):可读取文件的实际内容。
  2. 写(w):可以改变文件内容,不能删除。
  3. 执行权限(x),该文件具有可以被系统执行的权限。

如:-rw-r--r-- :所有者(U)可读,写,不可执行

改变权限

语法:chmod [-R] 权限表达式 文件名

image.png

两种权限修改方式

  1. 使用数字时直接在chmod命令后跟数字形式的权限字符串
[root@VM-4-9-centos test1]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Apr 14 22:24 test2
[root@VM-4-9-centos test1]# chmod 700 test2
[root@VM-4-9-centos test1]# ls -l
total 4
drwx------ 2 root root 4096 Apr 14 22:24 test2

2。 使用字符时:

image.png

[root@VM-4-9-centos test1]# chmod g+r test2
[root@VM-4-9-centos test1]# ls -l
total 4
drwxr----- 2 root root 4096 Apr 14 22:24 test2

文件操作进阶

搜索与查找

泛用查找

  1. 语法:which [-a] 命令名 在PATH变量的路径中查找命令的对应文件名参数:a:PATH变量的路径中查找命令的对应文件名 参数: -a:将PATH变量中匹配的所有文件均列出,否则只列出第一次匹配的文件。

PATH:环境变量,一般大写,多用于保存可执行程序的路径,多个路径用:隔开,SHELL会在PATH:环境变量,一般大写,多用于保存可执行程序的路径,多个路径用:隔开,SHELL会在PATH自左至右依次搜寻对应的程序名。

[root@VM-4-9-centos test1]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/jre/bin:/root/bin
[root@VM-4-9-centos /]# which -a cd
/usr/bin/cd

2.语法 whereis [-blmsu] 文件或目录名 在系统规定的几个常用目录内查找指定文件或目录 参数:

  • -b:只查找二进制文件
  • -l:列出查找的目录范围
  • -m:只在man命令对应的目录下查找
  • -s:只查找source源文件
  • -u:查找不在-b,-m,-s范围内的文件
[root@VM-4-9-centos /]# whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz
  1. 语法:locate [-iclSr] 关键字 在索引数据库内用关键字搜索文件或目录(Linux有内置的数据库,其用键值对的形式对每个文件进行存储索引,索引时间是系统负载较少,因此可能刚创建的文件查不到) 参数:
  • -i:忽略大小写
  • -c:输出找到的文件数,不输出文件名
  • -l:指定输出时找到的结果行数
  • -S:输出所查找的索引数据库的相关信息
  • -r:支持正则表达式的表示方式
 [root@VM-4-9-centos /]# locate -l 3 .html
/usr/java/jdk1.8.0_121/README.html
/usr/java/jdk1.8.0_121/db/README-JDK.html
/usr/java/jdk1.8.0_121/db/RELEASE-NOTES.html
[root@VM-4-9-centos /]# locate -S
Database /var/lib/mlocate/mlocate.db:
   23,604 directories
   166,093 files
   11,933,911 bytes in file names
   4,526,836 bytes used to store database

通用查找find

语法:find [PATH] [option] [action] 在PATH路径下,用option的内容进行搜索,搜索后执行action操作。

缺点:不适用索引数据库,速度较慢 参数:

  • 时间 option:-atime,-ctime,-mtime +-天数(+代表几天前,-代表几天内)
  1. mtime:文件内容更改时就会修改该时间
  2. ctime:文件属性(状态)修改时就会修改该时间
  3. atime:文件内容被访问时修改该时间
[root@VM-4-9-centos ~]# find /test1/test2 -mtime -3
/test1/test2

#### option
  • 用户或组option -uid,-gid 用户或组id -user,-group 用户或组名 -nouser,-nogroup

  • 权限,文件名或其他属性option -name 文件或目录名 -size +- SIZE(c字节,kKB) -type 文件类型(f,d,b,c,l) -perm 权限(完全匹配) -perm -权限(完全包含) -perm /权限(任一包含)

action

语法:-exec 命令名 {} ;

[root@VM-4-9-centos ~]# find /usr/src/springbootProject -mtime -3 -exec ls -l {} \;
total 37320
-rw-r--r-- 1 root root      993 Apr 14 16:24 log.txt
-rw-r--r-- 1 root root   389671 Apr 14 15:50 mingchu.jpg
-rw------- 1 root root    22197 Apr 14 22:35 nohup.out
-rw-r--r-- 1 root root      993 Apr 14 16:19 nohup.txt
-rwxr-xr-x 1 www  www  35628768 Apr 14 15:43 yuntu-0.0.1-SNAPSHOT.jar
-rwxr-xr-x 1 www  www   2151302 Apr 14 15:43 yuntu-0.0.1-SNAPSHOT.jar.original
-rw-r--r-- 1 root root 389671 Apr 14 15:50 /usr/src/springbootProject/mingchu.jpg
-rwxr-xr-x 1 www www 35628768 Apr 14 15:43 /usr/src/springbootProject/yuntu-0.0.1-SNAPSHOT.jar
-rw------- 1 root root 22197 Apr 14 22:35 /usr/src/springbootProject/nohup.out
-rwxr-xr-x 1 www www 2151302 Apr 14 15:43 /usr/src/springbootProject/yuntu-0.0.1-SNAPSHOT.jar.original
-rw-r--r-- 1 root root 993 Apr 14 16:24 /usr/src/springbootProject/log.txt
-rw-r--r-- 1 root root 993 Apr 14 16:19 /usr/src/springbootProject/nohup.txt
-rw-r--r-- 1 root root 46 Apr 14 16:56 /usr/src/springbootProject/.user.ini

归档与压缩

归档

概念:将多个文件变为一个文件 语法:tar [-z|-j|-J] [-c|-t|-x] [-v] [-f] 文件名 用于打包或解包文件夹,配合参数可以在打包或解包的同时压缩或解压 参数:

  • -c建立打包文件
  • -x解包或解压缩
  • -t查看打包的文件内容,不解包
  • -zjJ 分别指定压缩程序为gzip,bzip2,xz进行压缩或解压缩
  • -v显示过程信息
  • -f制定文件命名

压缩

概念:利用压缩算法将文件大小进行压缩 gzip,bzip2,xz是目前用用最广泛的三种压缩程序,压缩比以及性能依次递进。(示例为gzip) 语法:gzip [-cdtv#] 文件名 gcat,gmore,gless 文件名.gz gzip命令用于压缩或解压文件 gcat,gmore,gless用于查看压缩后的文件内容。 参数:

  • -d:解压缩
  • -c:显示压缩过程的信息
  • -t:校验压缩文件一致性
  • -v:显示压缩比的信息
  • -#:为1-9数字,越小压缩比越低,压缩速度越快,默认为6

image.png

文本编辑器nano

文本编辑程序

  • 文本编辑程序:用于编辑与查看文本文件,但不能对文字做格式处理(加粗,倾斜等)
  • 常见如WIndows记事本,Linux中Vi,Vim,Nano,Emacs等

文本处理程序

  • 文本处理程序:不仅可以编辑查看文本文件,还可以进行格式处理。
  • 常见Windows:Office,MacOS的iWork

命令

  • 打开或新建文件:#nano 文件名
  • 禁止自动换行:#nano -w /etc/fstab
  • 保存:CTRL+O
  • 退出:CTRL+X
  • 搜索:CTRL+W
  • 剪切:CTRL+K
  • 粘贴:CTRL+U

磁盘管理

数据流与重定向

基本概念

将数据从指定的流输入或输出,称为数据流重定向

  • 标准输入(stdin):代码为0,符号位<或<<;
  • 标准输出(stdout):代码1,符号为>或>>;
  • 标准错误输出(stderr):代码为2,符号为2>或2>>

几个示例

image.png

image.png

image.png

管道命令

  • 对前面的命令进行处理,界定符号为‘|’,仅会处理stdout,对stderr会忽略。
  • 管道命令必须要能够接受来自前一个命令的数据作为stdin。

选取命令 cut与grep

  1. 语法: cut [-df] [-c] 将前一个命令输出的单行内容进行切割和分解 参数:
  • -d:后面接用于分隔的字符,如|“;”,和 -f一起使用。
  • -f:依据-d的分隔字符将一行的信息进行分隔,-f指定选取第几段。
  • -c:以行内字符的位置取出某段字段,eg"5-10"
[root@VM-4-9-centos ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/jre/bin:/root/bin
[root@VM-4-9-centos ~]# echo $PATH | cut -d ':' -f 5
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin
[root@VM-4-9-centos ~]# echo $PATH | cut -c 5-10
/local

  1. 语法:grep [-cinv] '关键字' 在前一个命令的多行输出内容中选取符合关键字的行进行显示 参数:
  • -c:对匹配的关键字的次数进行计数
  • -i:忽略大小写
  • -n:输入符合条件的行的同时将行号一起输出
  • -v:反向选择,即输出不符合关键字的行

其他命令

image.png

image.png

image.png

进程管理

ps命令

某个时刻的进程状况 语法:

  • ps -aux 系统的所有进程数据
  • ps -lA 所有进程的另一种形式
  • ps -axjf 查看进程树

image.png

[root@VM-4-9-centos ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  51920  3560 ?        Ss   Apr07   1:28 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S    Apr07   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<   Apr07   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    Apr07   0:23 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S    Apr07   0:00 [migration/0]
root         8  0.0  0.0      0     0 ?        S    Apr07   0:00 [rcu_bh]

进程列表的常用属性值:

image.png

top命令

  • 动态进程管理,实时监控进程的活动状态。
  • top命令按照CPU的使用状况,内存使用情况以及执行时间对进程进行排序
  • top命令执行过程中,可以使用各种命令进行交互。

语法: top [-d 数字]|top [-bnp] 参数:

  • -d :参数为秒,top更新的频率,默认为5秒
  • -b :以批次的方式执行top,通常会搭配数据流
  • -n :与-b搭配,需要进行几次的top的输出结果
  • -p :指定某个PID进行监测

top执行过程可以使用的按键指令:

image.png

其他常用的进程管理命令

image.png

网络管理

Shell脚本编程

基本概念

  • Shell是指系统内核程序之上的一系列程序的集合。

  • 如:bash,sh,csh

  • #是注释,其后为注释内容

  • #!用于指定当前脚本所使用的Shell版本

  • 后缀名一般为.sh

两种执行方式

  1. 直接命令行执行,必须拥有Shell脚本文件的可读以及可执行权限 如:myscript.sh
  2. 以bash命令执行,只要拥有Shell脚本文件的可读权限即可。 如:bash myscript.sh

自定义命令别名

语法:alias/unalias alias 别名 = '命令字符串' 用于设定自定义命名 unalias 别名 取消自定义别名

[root@VM-4-9-centos ~]# alias test1='cd/usr; ls;'
[root@VM-4-9-centos ~]# test1
-bash: cd/usr: No such file or directory

常用通配符以及实例

image.png

image.png

VI/VIM文本编辑器

概念

VI原意为‘visual interface’,即可视化编辑器,是一个文本编辑程序。vim是vi的加强版。其中vs code 就是由其开发而来。

两种命令

  1. 命令模式:命令序列组成,完成某些特定的动作;
  2. 插入模式: 输入或编辑文本。

进入与退出

  1. 进入: vi 文件名
  2. 退出: ":wq"保存文件并退出,":q!":退出但不保存修改。

变量与输出

echo 命令

基本功能:显示一行文本内容

相当于C里面的printf()

展开功能

  • 展开字符串
  • 展开变量值
  • 展开表达式
  • 展开命令

第一个Shell脚本

[root@VM-4-9-centos lighthouse]# vi sh01.sh
#!/bin/bash
#This is my first shell script.
#Show "hello world"
echo -e "hello world"
exit 0
[root@VM-4-9-centos lighthouse]# sh sh01.sh
hello world
  • 注释部分一般说明该脚本的功能,版本信息,作者,版权等
  • 执行shell脚本一般使用sh命令或bash命令
  • shell脚本的后缀名一般为.sh

Shell的变量功能

Shell变量相关常用命令

  • 变量的表示:变量名或变量名或{变量名}
  • 设值与取消:变量名=变量值,unset 变量名,这里一般不会在变量名前加$
  • 变量的显示:echo
  • 环境变量相关操作:env,export
  • 变量的输入:read
  • 数组:declare/typeset
  1. env用于查看已有的环境变量

  2. set用于查看所有的变量,即比如说当前脚本中自定义的变量+环境变量

环境变量的功能:

  • 环境变量与自定义变量的主要区别是作用域的不同
  • 环境变量在整个bash运行过程中均有效,而自定义变量只在当前进程中有效
  • 使用export命令将自定义变量转为环境变量
[root@VM-4-9-centos /]# name=xie-super
[root@VM-4-9-centos /]# export name
[root@VM-4-9-centos /]# env
XDG_SESSION_ID=19479
HOSTNAME=VM-4-9-centosSHELL=/bin/bashTERM=vt100
HISTSIZE=3000
SSH_CLIENT=119.28.22.215 43414 22
SSH_TTY=/dev/pts/1
name=xie-super
  1. 语法:read [-pt] 变量名 从终端键盘输入变量值 参数:
  • -p:输入前终端提示语句
  • -t:输入变量时等到用户的时间,后面加时间,单位秒
[root@VM-4-9-centos lighthouse]# read -p "pleash input:" test
pleash input:haha
[root@VM-4-9-centos lighthouse]# echo $test
haha
  1. 语法:declear [-aixr] 变量名 参数:
  • -a:声明为数组
  • -i:声明为整形
  • -x:声明为环境变量
  • -r:声明为只读变量
[root@VM-4-9-centos lighthouse]# declare -a array
[root@VM-4-9-centos lighthouse]# array[1]="xie-super"
[root@VM-4-9-centos lighthouse]# echo $array[1]
[1]
[root@VM-4-9-centos lighthouse]# echo ${array[1]}
xie-super

image.png

  1. test 用于测试逻辑表达式

image.png

因为echo "exist"与echo "not exist"永远为真,就只是判断逻辑表达式是否为真即可,为真则执行前者,为假则执行后者。

image.png

参数传值:

vim sh02.sh
echo "the script name is $0"
echo "total parameter number is $#"
echo "whole parameter is $@"
echo "first parameter is $1"

[root@VM-4-9-centos lighthouse]# sh sh02.sh software csu china
the script name is sh02.sh
total parameter number is 3
whole parameter is software csu china
first parameter is software

image.png

条件与循环语句

if语句

1.
if [表达式]; then
    语句
fi 


2.
if [表达式]; then
    语句
elif
    语句
else
    语句
fi    

使用范例

vim sh03.sh
read -p "input your choice(y/n)" flag
if [ "$flag" == "Y" ] || [ "$flag" == "y" ]; then
        echo "your choice is yes, continue"
elif [ "$flag" == "N" ] ||  [ "$flag" == "n" ]; then
        echo "your choice is no"
else
        echo "no meaningful input"
fi
[root@VM-4-9-centos lighthouse]# sh sh03.sh
input your choice(y/n)y
your choice is yes, continue
[root@VM-4-9-centos lighthouse]# sh sh03.sh
input your choice(y/n)N
your choice is no
[root@VM-4-9-centos lighthouse]# sh sh03.sh
input your choice(y/n)i
no meaningful input
  • 注意表达式与中括号之间的空格
  • linux的shell脚本中 == 和 = 含义相同

case ... esac语句

相当于C中的switch

case $变量名 in
    "变量值")
        语句
     ;;
     "变量值")
        语句
     ;;
     
esac

范例:

image.png

while循环语句

1.
while [条件表达式]
do
    语句
done

2. 
until [条件表达式]
do
    语句
done    

until 是满足条件表达式退出循环,while是不满足表达式退出

范例

read -p "please input ,Yes to quit:" flag
while [ "$flag" != "Yes" -a "$flag" != "YES" ]
do
        read -p "input flag:" flag
done
echo "input Yes to quit"
[root@VM-4-9-centos lighthouse]# sh sh04.sh
please input ,Yes to quit:No
input flag:Yes
input Yes to quit

for循环语句

1. 
for 变量名 in value1 value2 value3
do
    语句
done

2.
for ((初始值;终止条件;执行步长))
do
    语句
done

函数function

语法: function 函数名() { 程序段 }

#调用函数的语法: 函数名

  • 由于shell脚本不是编译执行,是从上到下,从左到右解释执行,故函数定义在脚本最前面
  • 函数可传参,直接在函数名后列出参数,空格隔开,为局部变量
  • 在函数里可以访问参数,为0,0,1...

Shell脚本的调试与跟踪

语法:sh [-nvx] script.sh 参数:

  • -n :不执行script,仅检查语法
  • -v:执行之前,先将script内容显示在屏幕
  • -x:跟踪执行过程

软件安装

make与makefile

软件包管理

Linux平台下的软件都是以源代码方式进行发布的

RPM

发行商代表:Red Hat/CentOS 软件管理机制:RPM 命令:rpm 解决依赖与升级:yum

使用RPM安装软件

image.png

YUM

基于RPM的前端软件包管理器,主要特点为:

  • 从指定服务器自动安装RPM包并安装
  • 自动处理包依赖关系
  • 引入仓库和容器的概念

DPKG

发行商代表:Debian/Ubuntu 软件管理机制:DPKG 命令:dpkg 解决依赖与升级:apt-get