导图社区 Linux知识框架图
Linux知识框架图,包括常用命令、文件管理、用户与用户组管理、软件安装卸载管理、进程管理、磁盘管理、Linux编程等内容。
编辑于2021-12-29 10:21:40Linux知识框架图
图形界面
桌面类型
X windows(unix)
基本模型是X的客户-服务器模型。
KDE(多种拓展程序)
GNOME(取代KDE)
常见的Linux桌面系统有KDE和GNOME两种。
系统引导的过程按如下顺序进行:BIOS自检→用户登录→Linux内核运行→MBR中的引导装载程序启动。
字符界面
shell(windows 下的cmd)
Bourne
Shell
C Shell
Korn Shell
POSIX Shell
Bourne Again Shell(bash)
转义字符
提示符
提示符:shell准备接受命令时显示的字符串,在提示符之后,用户输入命令,最后按Enter键。shell命令解释程序将接收、分析解释并执行相应的命令,执行结果显示在屏幕上。 例如:[mengqc@localhost ~]$ 是shell主提示符。其中 “mengqc”表示当前用户名 “localhost”是默认的主机名 “~”表示默认用户主目录 “$ ” 表示当前用户是普通用户。 “# ”表示超级用户。 我们约定,在下面的示例中一般用户的主提示符为“$ ”,超级用户的主提示符为“# ”。
版本
由于三组数字组成,第一组表示目前发布的内核版本,第二组表示稳定或开发版本,第三组表示错误修补次数
稳定版本
第二个数为偶数
A) 2.4.1 B)3.0.1 C) 2.8.5-2
开发版本 (非稳定版)
第二个数为奇数
A) 2.1.0 B)2.3.5
常见操作
改变默认启动方式:/etc/inittab
命令帮助:man 命令/命令 --help
更改密码 passwd
切换用户:su 用户名/root
以root权限执行某个命令:sudo 命令
ifconfig 显示IP地址
ifconfig命令通常用于配置内核驻留的网络接口。
who (查看当前用户以及终端)
(init 5) pts/o 虚拟终端 /dev/pts/o
使用ctrl+alt+[F1~F8]来切换操作终端
Q:/dev/tty0与/dev/tty1 …/dev/tty63是什么?它们之间有什么区别? A:/dev/tty0代表当前虚拟控制台,而/dev/tty1等代表第一个虚拟控制台,例如当使用ALT+F2进行切换时,系统的虚拟控制台为/dev/tty2 ,当前的控制台则指向/dev/tty2
tty (teletypewriters)查看现在使用的终端;
tty字段表示进程不占用终端
(终端是文件,使用要加绝对路径) 使用echo “test xxx” > /dev/ttyx /dev/pts/1可以发送到相应的终端设备中。
改变终端
init系列
init 0:关机
init 1:仅允许root的维护模式
init 3:标准多用户命令界面(tty1)
init 5:图形化界面(pts/O)
init 6: 重启(reboot/shutdown)
普通用户无法使用shutdown
常用命令
切换目录 cd
cd 用户的主目录
当用户键入命令“cd”,并按Enter键后,会自动进入用户主目录
cd ..上级目录
cd ../.. 上级目录的上级目录(移动两级目录)
当前目录是/home/mengqc/tmp ,想列出/home/liu目录的内容 ls ../../liu
显示当前路径 pwd
显示文件 ls
-a 显示隐藏文件
-c 按修改日期排序
-i 显示文件节点
-h 人性化显示
-l 详细显示
文件类型与权限 链接数 文件主 文件组 文件大小 建立或最近修改的时间 文件名
ls -alhi 显示一切
l 链接 d 目录 -普通文件 可读r 可写w 可执行x 文件大小用byte(字节)来表示,空目录一般是1024b,1k=1024b
实战
ls -f* 显示所有文件名f开头的文件
日期
当前日期date
cal 日历
清屏clear
改变用户身份
su
-c<指令> 执行完指定的指令后,即恢复原来的身份;
su root 切换管理员身份 (当root切换回普通用户时不需要密码)
[root@localhost ~]# root:当前登录用户名 localhost:当前主机名 ~:当前所在目录,不带路径 #:#表示管理员,$表示普通用户
切换到root 用户并执行一次命令 : su root -c ls
sudo
普通用户使用sudo有个前提条件 在etc/sudoers 文件中有该用户信息 这个文件就算是root也默认只有可读权限 先要登陆root -> chmod u+w etc/sudoers ->vi etc/sudoers 添加用户信息 ->用户名 ALL=(ALL:ALL) ALL
sudo -u 用户名 命令
whoami
命令行一次执行多个命令
执行操作符
1.每个命令之间用;隔开 说明:各命令的执行结果,不会影响其它命令的执行。换句话说,各个命令都会执行, 但不保证每个命令都执行成功。 cd /home/PyTest/src; python suning.py
2.每个命令之间用&&隔开 逻辑and 说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。 cd /home/PyTest/src&&python suning.py
3.每个命令之间用|| 逻辑or 说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功 一条命令为止。 cd /home/PyTest/123 || echo "error234"
利用管道技术显示student用户的配置信息,该命令是 cat /etc/passwd | grep student
4.命令之间用|隔开 管道可以将一个命令的输出导向另一个命令的输入,从而让两个(或者更多命令)像流水线一样连续工作,不断地处理文本流。在命令行中,我们用|表示管道 cd /home/PyTest/123 | echo "error234"
复合命令
{空格 命令 ; 命令 ···· 最后一个命令 ; 空格 }形式
不会产生新的子进程
(命令)
会产生新的子进程
实战
$ pwd /home/mengqc/dir1 $ (cd /bin ; pwd ) (在子shell中将工作目录改为/bin) /bin $ pwd /home/mengqc/dir1 (仍是原来的目录,不受上面命令影响) $ { cd /bin ; pwd ; } /bin $ pwd /bin (同一进程,前后关联)
进入bin目录,将pwd内容存储到f1.txt cd /bin ; pwd > f1.txt 最终显示为bin目录 { cd /bin ; pwd ; } > f1.txt ,最终显示为bin目录,不会产生新的进程; (cd /bin ; pwd )> f1.txt 最终显示目录不变,产生新的子进程
重定向
输入重定向 例如: cat < /etc/passwd
输出重定向
(1) command > file 覆盖操作;(如果目标文件不存在,则创建文件将标准输出内容保存进去;如果目标文件存在,则覆盖其中的内容)
(2) command >> file 追加操作 (原来的文本内容不会被覆盖,而是在文件尾部添加输出的内容。当然,如果文件不存在,也会自动创建)
命令嵌套子命令
1. 符号:` `
2. $() 效果同` `
3. 命令:xargs(管道是实现“将前面的标准输出作为后面的标准输入”xargs是实现 “将标准输入作为命令的参数”)
4. find命令的-exec参数 xargs:通过缓冲方式并以前面命令行的输出作为参数,随后的命令调用该参数
pr打印
tab制表符可自动补全命令
技巧
如果你想要有语法高亮的 cat,可以试试 ccat 命令。
exa 增强了 ls 命令,如果你需要在很多目录上浏览各种文件 ,ranger 命令可以比 cd 和 cat 更有效率,甚至可以在你的终端预览图片。
fd 是一个比 find 更简单更快的命令,他还会自动地忽略掉一些你配置在 .gitignore 中的文件,以及 .git 下的文件。
fzf 会是一个很好用的文件搜索神器,其主要是搜索当前目录以下的文件,还可以使用 fzf --preview 'cat {}'边搜索文件边浏览内容。
grep 是一个上古神器,然而,ack、ag 和 rg 是更好的grep,和上面的 fd一样,在递归目录匹配的时候,会使用你配置在 .gitignore 中的规则。
rm 是一个危险的命令,尤其是各种 rm -rf …,所以,trash 是一个更好的删除命令。
man 命令是好读文档的命令,但是man的文档有时候太长了,所以,你可以试试 tldr 命令,把文档上的一些示例整出来给你看。
如果你想要一个图示化的ping,你可以试试 prettyping 。
如果你想搜索以前打过的命令,不要再用 Ctrl +R 了,你可以使用加强版的 hstr 。
htop 是 top 的一个加强版。然而,还有很多的各式各样的top,比如:用于看IO负载的 iotop,网络负载的 iftop, 以及把这些top都集成在一起的 atop。
ncdu 比 du 好用多了。另一个选择是 nnn。
如果你想把你的命令行操作录制成一个 SVG 动图,那么你可以尝试使用 asciinema 和 svg-trem 。
httpie 是一个可以用来替代 curl 和 wget 的 http 客户端,httpie 支持 json 和语法高亮,可以使用简单的语法进行 http 访问: http -v github.com。
tmux 在需要经常登录远程服务器工作的时候会很有用,可以保持远程登录的会话,还可以在一个窗口中查看多个 shell 的状态。
sshrc 是个神器,在你登录远程服务器的时候也能使用本机的 shell 的 rc 文件中的配置。
goaccess 这个是一个轻量级的分析统计日志文件的工具,主要是分析各种各样的 access log。
文件管理
基础知识
linux常用文件类别
普通文件【-】
纯文本(ASCII)
二进制(binary)
数据格式(data)
目录文件(directory)【d】
(.)目录本身 ;(..)父目录 。
链接文件(link)【l】
软s 快捷方式
硬h 相当于复制,但是会同步更新
设备文件【b】/【c】
块(block) 硬盘
字符(character) 鼠键打印机等
管道文件(FIFO,pipe)【p】
FIFO是first-in-first-on(先进先出)目的:解决多个程序同时访问一个所造成的错误。用于不同进程间的信息传递。
linux目录结构概述
linux系统目录 /
在根目录下,通常有以下目录: 1. bin目录包含二进制(binary)文件的可执行程序。 程序名许多就是命令名 2. sbin目录中存放用于管理系统的命令。 3. boot用于存放引导系统时使用的各种文件,如LILO等。 4. etc目录非常重要,它包含许多Linux系统配置文件(如密码文件/etc/passwd、/etc/profile等)。 5. root目录是超级用户的目录。 6. dev目录包含标示设备的特别文件, 存放系统中所有块设备和字符设备文件,外部设备文件(硬盘) 7. home目录是用户起始目录的基础目录。通常,用户的主目录就保存在该目录中。 8. lib目录中保存程序运行时使用的共享库。 9. lost+found目录中存放系统非正常关闭时正在处理的文件,以便下次系统启动时予以恢复。 10. mnt目录中存放安装文件系统的安装点。 11. proc目录实际上是一个虚拟文件系统。 12. tmp目录用于存放程序运行时生成的临时文件。 13. usr目录中包含了多个子目录,其中保存系统上一些最重要的程序,可供所有用户共享。 14. var包括系统正常运行时要改变的数据。
1. bin目录包含二进制(binary)文件的可执行程序。 程序名许多就是命令名
2. sbin目录中存放用于管理系统的命令。
3. boot用于存放引导系统时使用的各种文件,如LILO等。
4. etc目录非常重要,它包含许多Linux系统配置文件(如密码文件/etc/passwd、/etc/profile等)。
1./etc/profile:是全局profile文件,设置后会影响到所有用户
2./home/username/.profile或.bash_profile是针对特定用户的,可以针对用户,来配置自己的环境变量。
注意:profile是unix上才有的;bash_profile是Linux下有的(Linux下,用户目录没有.profile文件)/home/userName/.bash_profile,是隐藏文件,需要使用ls -alh才能看到的。
5. root目录是超级用户的目录。
6. dev目录包含标示设备的特别文件, 存放系统中所有块设备和字符设备文件,外部设备文件(硬盘)
7. home目录是用户起始目录的基础目录。通常,用户的主目录就保存在该目录中。
8. lib目录中保存程序运行时使用的共享库。
9. lost+found目录中存放系统非正常关闭时正在处理的文件,以便下次系统启动时予以恢复。
10. mnt目录中存放安装文件系统的安装点。
11. proc目录实际上是一个虚拟文件系统。
可以识别Windous的FAT32文件系统。
12. tmp目录用于存放程序运行时生成的临时文件。
13. usr目录中包含了多个子目录,其中保存系统上一些最重要的程序,可供所有用户共享。
14. var包括系统正常运行时要改变的数据。
主目录 ~/$HOME
hellen用户的用户主目录是/home/hellen。
通配符
* :0个或多个任意字符
? :单个任意字符 (????表示四个任意字符)
[ ] :单个括号内的字符( [!^ 表示非)
文件属性
i节点
起文件控制块作用的结构
文件命名:1、不超过256 ,2、避免使用空格< > ˋ ″ 等特殊字符
基本操作
文本处理
显示
cat
cat -b 文件名 (加上编号)
cat m1 m2 > m3 (创建了m3,合并输出)
复制改名 cat file1.txt >file2.txt
more
more -dc (清屏输出并在下方显示百分比)
more -10 (每10行显示一次)
缺点:只能向后翻阅
一次显示一页
less
可以用光标上下翻阅,与more类似,more不能向上
head
仅显示前5行:head -n 5 文件名
除了后5行都显示: head -n -5 文件名
(默认显示前10行)
tail
仅显示后5行:tail -n 5 文件名(或者tail -5 文件名)
除了前5行都显示:tail -n -5 文件名
cut
No Name Mark Percent 01 tom 69 91 02 jack 71 87 03 alex 68 98 f1的内容
# cut -d’ ’ –f 1 x1.txt (以空格作为分隔符显示f1第1字段的内容) NO 01 02 03
# cut -d’ ’ –f 2,3 x1.txt 以空格作为分隔符(显示f1第2,3字段的内容)
分隔符只能是单个字符
查询
grep
grep -i 不区分大小写
grep -v 反向匹配,除了光健字的行其余都输出
grep -x 只严格整行,必须一模一样
egrep(相当于grep -e,正则匹配更强大(包括表达式组和可选项))
fgrep (相当于 grep -f更快,但是不能用正则匹配)
比较
comm [选项] 文件1 文件2
前提:m1 m2 是已排序文件
comm -12 m1 m2 (输出m1,m2的交集)
-1 不输出仅在文件1中出现的行。(m2 和 m1在m2中的交集) -2 不输出仅在文件2中出现的行。(m1 和 m1在m2中的交集) -3 不输出在两个文件中都存在的行。 (m1 m2 差集)
diff [选项] 文件1 文件2
n1 a n3,n4 (把文件1的n1行附加到文件2的n3~n4行后,则二者相同) n1,n2 d n3 (删除文件1的n1~n2行及文件2的n3行,则二者相同) n1,n2 c n3,n4 (把文件1的n1~n2行改为文件2的n3~n4行,则二者相同) 字母a表示附加,字母d表示删除,字母c表示修改
统计
wc
-c,--bytes 统计字节数。 -l,--lines 统计行数。 -m,--chars 统计字符数。 -w,--words 统计字数。
显示顺序不受命令影响 输出格式:行数 字数 字节数 文件名
统计当前目录下的文件数: ls -l | wc -l 结果为:1+当前文件数
排序
sort
sort -n 数字排序,不转化成ascii码(局限:sort会把数字转化成字符,再对照ASCII码排序。例如:11000小于1200)
sort -t '空格' 指定空格作为分隔符
sort -k 数字 -k用于指定列数
sort -u 去重
sort -r 降序
sort -o 保存修改(变更源文件) 注:除了-o sort不改变源文件,只是显示排序结果
综合例子: [rocrocket@rocrocket programming]$ cat f1t banana:30:5.5 apple:105:2.5 pear:90:2.3 cherry:20:60 orange:20:3.4 apple:105:2.5 这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。以水果数量来排序,也就是以第二列来排序,-t设定间隔符。指定了间隔符之后,就可以用-k来指定列数了,-u去重(此刻的-u 把apple和orange的那一整条都去掉了,仅仅是因为某个参数相同),-n [rocrocket@rocrocket programming]$ sort -u -t ':' -k 2nr f1 apple:105:2.5 pear:90:2.3 banana:30:5.5 cherry:20:60 去重,以:为分隔符,先以第二排降序排序,再以第一排排序,保存到f1中 [rocrocket@rocrocket programming]$ sort -u -t ':' -k 2nr -k 1 f1-o f1 apple:105:2.5 pear:90:2.3 banana:30:5.5 cherry:20:60 orange:20:3.4
去重
uniq
uniq -c 显示每行出现的次数
uniq -u 只显示不重复的行
vi内容操作(建议配合set number使用)
复制
nyy (光标为起点,向下复制n行数据)
粘贴
p
剪切
按v进入视角模式,移动光标覆盖要处理的内容,再按d,到指定位置按p
删除
ndd (光标为起点,向下删除n行,不包括n)
:1,.d (删除第一行到光标指定的行,光标若在结尾则是删除全部)
保存
: wq (保存并退出)
: q! (不保存退出)
撤销
【Esc】下按u
文件以及目录处理
查找
find
find . -name 'kmxs*' (查找当前目录下文件名开头为kmxs的文件)
find ! -name 'kmxs' (查找文件名不为kmxs的所有文件)
find . -name 'kmxs*' -o -name '*.txt' (查找当前目录下文件名开头为kmxs或以.txt结尾的文件)
find / -type l (查找根目录下文件类型为l的文件)
find /home/ -empty (查找home目录下的空文件)
find . -cmin 5 (过去5分钟内被修改的文件)
find / atime 1(过去一天没访问过的文件)
find . -size -1G (查找当前目录下小于1G的文件)
find . -size +500M -size -1G (查找当前目录下大于500m且小于1G的文件)
find . -name 'kmxs' -exec cat {} \; (查找当前目录下名字为kmxs的文件并用cat显示) ("}"与\之间有空格)
find . -name 'kmxs*' -a -name '*.txt' (查找当前目录下文件名开头为kmxs且.txt结尾的文件)
find . -type l -name '?f1' -o -type l -name 'km*' -user 'root' -exec chmod 777 {} \; 查找当前目录下文件名开头为km或以fl结尾的三个字符命名且属于root的链接文件并把他的权限改为777)
locate
索引搜索,速度极快 (类似windows的everything)
索引缓存数据库:/var/lib/mlocate/mlocate.db
数据库更新:updatedb
复制
cp
注:若文件名字已经存在,会覆盖
cp -r 源目录 目标文件 (-r能够复制整个目录包括子目录)
cp -i 复制之前给出提示
注:cp就是cp,虽然可以理解成copy,但是不能直接用copy
移动
mv
可以剪切+改名(mv 源文件 新名字)
cp -i 剪切之前给出提示
mv /home/mengqc/* . /new 将目录/home/mengqc中的所有文件移到当前目录的new中。
删除
rm
rm -r 删除目录及其子目录(默认情况下不可删除目录)
rm -rf 强制删除不询问
rmdir (删除空目录)
链接
ln
软/符号(源文件的快捷方式)
ln -s [源文件或目录] [目标文件或目录/链接名字]
ln -s /home/mengqc/mub1 /home/liuzh/abc 在目录/home/liuzh下建立一个符号链接文件abc,使它指向目录/home/mengqc/mub1:
硬(相当于复制,但是会有源文件同步更新)(不可用于目录)(默认硬链接)
ln [源文件或目录] [目标文件或目录/链接名字] .hard
创建
touch
可同时创建多个空文件:touch f1 f2 f3 f4
touch –m mfile (将文件mfile的修改时间改为系统当前时间)
vi/vim
编辑,如果没有就创建
mkdir
-m 设定权限(mode)
mkdir --mode=700 /home/mengqc/test 在目录/home/mengqc下建立子目录test,并且只有文件主有读、写和执行权限,其他人无权访问 。
-p 同时创建子目录 (或父目录)
mkdir -p -m 750 bin/os_1 同时建立两个目录:bin和它的子目录os_1,权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问。
访问权限管理
四种用户类型:① 文件主 (uid) ② 同组用户(组用户gid) ③ 其他用户 ④ 超级用户
访问权限chmod
只有文件主或者root才可使用chmod
字母+操作符
一般格式: chmod [操作对象] [操作符号] [权限] [文件|目录] 操作对象who可以是下述字母中的任一个或者它们的组合: u(user ) g(group) o(others) a(all ,系统默认值) 操作符号可以是: + 添加 - 取消 = 赋予 mode所表示的权限可用下述字母的任意组合:r w x 等
chmod u+x ex1 给当前用户添加可执行权限
chmod u=r,ug=x ex1 将文件ex1的权限重新设置为文件主可以读和执行,组用户可以执行,其他用户无权访问
数字
chmod [n1n2n3] [文件|目录] 例如: r w x r – x r – – 1 1 1 1 0 1 1 0 0 7 5 4
x:2º=1 w:2¹=2 r:2²=4
chmod 777 f1 所有用户获得所有权限
默认权限umask
umask -S 查看当前掩码设置
取消组用户的写权限、其他用户的读、写和执行权限: $ umask u=rwx,g=rx,o=
注:不能直接利用umask命令创建一个可执行的文件,用户只能在其后利用chmod命令使它具有执行权限。 如果创建的是目录或者通过编译程序创建的一个可执行文件,将不受此限制。
更改所有权chown
chown [选项] [用户.组群] [文件|目录] chown [选项] [用户:组群] [文件|目录]
1.将文件ah的文件主改为student chown student ah 2.将文件ah的用户组改为student chown :student ah 3.将文件ah的文件主和用户组一起更改为root chown root.root ah 4. 将文件ah的用户组改为student chown .student ah
软件包管理
压缩打包
压缩
gzip
使用gzip时需要注意以下几点。 (1)默认gzip压缩的文件会以.gz结尾,同时删除原始文件。 (2)若不希望使用.gz后缀,则需用-S覆盖。 (3)gunzip -c和zcat功能相同。
gzip -r 压缩过程中,保留原文件
gzip -v 显示压缩比
gzip file1.txt file2.txt 一条命令压缩多个文件,压缩之后,是各自分开的
bzip2
bzip2 [被压缩文件] #此种压缩不保留源文件
bzip -k 保留源文件
zip
打包
tar
tar [主选项+辅选项] [文件1] [文件2] [目录1] [目录2] [……]
tar czvf [新文件名称] [被压缩文件1] [被压缩文件2] [被压缩目录1] [被压缩目录2] [……] 通过bzip2打包并压缩
tar cjvf [新文件名称] [被压缩文件1] [被压缩文件2] [被压缩目录1] [被压缩目录2] [……] 通过gzip2打包并压缩
用什么压缩就用什么解压
解压释放
解压
bzip2 -d/bunzip2 [压缩文件.bz2] (专门解压bzip压缩的文件)
gzip -d/gunzip [压缩文件.gz] (专门解压gzip压缩的文件)
gzip -cd [压缩文件.gz] > [新文件名称] #保留源压缩文件,并解压为新文件名称的文件
tar xvf [被压缩文件] #主选项x会自动识别归档文件压缩的格式,并进行解压
tar xjvf [被压缩文件] -C [指定路径] 解压到指定路径
unzip
查看
zcat/gzip -c [压缩文件.gz] 查看gzip压缩过的源文件内容 不动源文件
gzip -c [被压缩文件] > [为压缩文件的新文件名.gz] #此种解压保留源文件
bzcat/bzip -c [压缩文件.bz2] 查看bzip2压缩过的文件源文件内容 不动源文件
bzip2 -c [被压缩文件] > [为压缩文件的新文件名.bz2] #此种解压保留源文件
tar tf [被压缩文件] 查看tar包内容
tar tvf 详细查看
用户与用户组管理
用户用户组文件
passwd
/etc/passwd文件
用户的关键信息如用户标识号、用户主目录等信息存放在此
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin …… mengqc:x:500:100:meng qingchang:/home/mengqc:/bin/bash 各个字段的顺序和含义 注册名:密码:用户标识号:组标识号:用户名(用户信息说名列):用户主目录:命令解释程序 ●密码字段使用一个“x”来代替,将/etc/shadow作为真正的密码文件
shadow
/etc/shadow文件中所对应的密码
有加了密的明文密码,只有root用户可以读取和操作
root: $1$Eu2q3042$.xiuOYvY1FWI8fqadgKtV.: 14198: 0: 99999:7∷: bin:∗:14198:0:99999:7∷: … mengqc:$1$YhdDo6Rv$M04OtRh2uCinarsAKVZG1/:14235:0:99999:7∷: ▲为每个用户提供一条记录,各个字段用“:”隔开,这9个字段意义是: 注册名:密文密码:上次更改密码时间距1970年1月1日的天数:密码更改后,不可以更改的天数:密码更改后,必须再次更改的天数(即密码的有效期):密码失效前警告用户的天数:密码失效后距账户被查封的天数:账户被查封时间距1970年1月1日的天数:保留字段
group
root:x:0:root,linuxsir 组群名:组群密码:组群标识号(GID):组群成员
gshadow
users:x:100:mengqc,liuzh,mengx 组名:密码:组标识号:用户列表 ●组的默认用户不必列在“用户列表”字段中。 ●在实际的应用中,“密码”字段不常用。
基础知识
用户账户分类
UID
1、root的UID是0,拥有系统最高权限。 2、在Linux系统中会把1~499的UID预留出来给系统账号使用,所创建的普通用户UID默认是从500开始的,默认的最大值是60000(增加)
1.root用户 0 2.系统用户 1-100 3.普通用户 500以上
id -u 用户名 (查看用户uid)
任何一个用户至少隶属一个组
用户:passwd -> shadow 用户组:group -> gshadow
新建了用户没有登录,home目录下是没有文件的(desktop music.......)
组分类
主要组:只有一个,登陆后的祖(私有祖的原用户)
次要组:除了主要组的其他所有组
私有组:只有一个用户
标准组:多个用户
groups 用户名 (显示用户的组)
id 用户名 (显示用户的uid gid 组)
用户操作
创建
建立用户账户
创建一个用户账户需要完成以下几个步骤: ①添加一个记录到/etc/passwd文件; ②创建用户的主目录; ③在用户的主目录中设置用户的默认配置文件(如.bashrc)。
useradd
useradd -u 510 –d /home/user1 –f -1 user1 (新建用户user1,UID为510,主目录为/home/user1,用户shell为/bin/bash,账户不过期。)
-d [路径] 设置用户主目录
-g [GID/组名] 设置用户主目录 (默认为100 即users 自己成一个组)
-u [UID] 设置用户ID (默认500+)
注意区分-U
passwd [选项] [用户名] (root可直接改其他用户的密码)
passwd -d [用户名] 删除密码
-l 锁定密码 (停止账号使用)
-g 修改群组密码
-x 设置密码的有效期
批量添加
1.批量创建
用户: newusers [psd格式的文本文件]
/etc/passwd文件的格式: user1:x:705:600:user1:/home/user1:/bin/bash 用户名:密码:UID:GID:用户信息:用户主目录:所用shell
2.取消密码信息加密
pwunconv (取消密码信息文件加密)
3.添加密码
chpasswd [密码格式的文本文件]
密码文件格式: user_name:password (用户名:明文密码)
chpasswd [-e] <密码文件 (使用-e选项,口令将以加密的方式传递;未使用-e选项,口令将按明文的形式传递)
4.密码加密
pwconv (对/etc/shadow加密处理)
实战
应用示例:要在学校计算机实验室的Linux服务器上建立1个班(50人)的学生账户,为每个学生分配登录用户名、口令、UID(701开始)、GID=600、用户工作目录和登录所用的shell。 (1) 添加组群用户 jb0401 # groupadd –g 600 jb0401 (2) 编辑一个passwd文件,命名: n_user.txt,内容如下: jb040101:x:701:600::/home/jb040101:/bin/bash jb040102:x:702:600::/home/jb040102:/bin/bash jb040103:x:703:600::/home/jb040103:/bin/bash jb040104:x:704:600::/home/jb040104:/bin/bash jb040105:x:705:600::/home/jb040105:/bin/bash …… (3) 执行命令:#newusers n_user.txt (4) 执行命令:#pwunconv (5)编辑一个文本文件,它包含所有要修改口令的用户的用户名和新口令,每行对应一个用户;把该文件命名为uw.txt保存。 # vi uw.txt jb040101:stujsj jb040102:stujsj jb040103:stujsj jb040104:stujsj jb040105:stujsj (6) 执行命令: #chpasswd < uw.txt (将uw.txt的内容传输到chpasswd指令来修改相应用户的密码) (7) 执行命令: #pwconv
用shell编程方法批量添加用户
修改用户属性
usermod
-u [UID] [用户名] (改ID)
-g [GID] [用户名] (改用户组,组名必须已存在)
-l [新名] [用户名] (修改用户账户名)
-s [shell类型] [用户名] (修改用户shell)
-L 与passwd -l 一样 (usermod -U解锁 )lock锁定
注意区分l
实战
应用示例1:将用户登录名tc01改为ta01,用户工作目录改为/home/ta01,所属组群改为root。 执行命令:#usermod –l ta01 tc01 –d /home/ta01 –g root
手动
与修改文件添加、删除用户的原理一样,所以直接修改/etc/passwd和/etc/shadow文件中该用户的账户信息行也可以达到修改用户属性目的,如果修改了用户登录名,则在shadow文件中所对应的用户名一定要修改。如果再手动更名用户工作目录,则就完整地修改了该用户的属性。 首先,修改/etc/passwd和/etc/shadow文件中该用户属性对应的域。 其次,用mv 命令更名该用户的工作目录。 最后,在/etc/group文件中修改该用户组对应的行。
删除
userdel
userdel 用户名 第一、删除/etc/passwd文件中的用户账户信息; find / -user 用户名 -exec rm {} \ 第二、删除对应于该账户的系统配置文件和该账户的工作目录。
userdel -r 用户名 (删除用户连同子目录) = userdel 用户名 + find / -user 用户名 -exec rm {} \
暂时删除(不删工作目录)
passwd –l 用户名
手动
(1)删除 /etc/passwd和/etc/shadow文件中该用户对应的行。 (2)用rm –fr命令强制递归地删除该用户的工作目录及目录下的所有子目录、文件。 (3)在/etc/group文件中删除该用户组对应的行。
组操作
创建
groupadd
-g 修改组ID,默认500以上
-p 添加密码
gpasswd
-a 添加用户到组
-d 从组删除用户
-A<组群管理员>:指定管理员
-M<用户>:指定组成员
-r:删除密码
gpasswd [选项](必有-A或者-M) 用户名 组名
手动
用 groupadd 命令,实际上就是在/etc/group和/etc/gshadow文件中写入信息。因此,该方法就是利用文本编辑器直接打开group组文件和gshadow组影子口令文件,这些文件的每一行有由“:”分隔的4个域,每行就是一个用户组的账户信息。若要添加用户组,只要在文件中写入相应的条目。 group 文件的格式: group name:passwd:group ID:user list 每个域的含义如下: group name:用户组群名称。
修改
groupmod
-g 修改GID (GID不可重复)
-o 可重复
-n 修改组名
删除
groupdel 组名 (必须确保要删除的组中没有用户)
软件安装卸载管理
kali
wget
wget 网址/文件名.tar.gz
wget -C 可以继续中断下载
deb
dpkg -i 安装一个 Debian 软件包
dpkg -c 列出 <package.deb> 的内容。
dpkg -r 移除一个已安装的包裹
dpkg -P 完全清除一个已安装的包裹。和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。
dpkg -L <package> 列出 <package> 安装的所有文件清单。同时请看 dpkg -c 来检查一个 .deb 文件的内容。
实战 下载并安装java
# 官网下载安装包 (默认保存到当前文件夹) wget https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html # 移动压缩包至opt目录 mv jdk-11.0.5_linux-x64_bin.tar.gz /etc/opt #切换至opt目录进行解压 cd /etc/opt #解压 tar -zxvf jdk-11.0.5_linux-x64_bin.tar.gz #拷贝解压后Java文件夹至/usr/bin cp -r jdk-11.0.5/ /usr/bin #安装并注册 update-alternatives --install /usr/bin/java java /etc/opt/jdk-11.0.5/bin/java 1 update-alternatives --install /usr/bin/javac javac /etc/opt/jdk-11.0.5/bin/javac 1 update-alternatives --set java /etc/opt/jdk-11.0.5/bin/java update-alternatives --set javac /etc/opt/jdk-11.0.5/bin/javac #检查是否成功配置Java环境 java -version
redhat/centos
yum (Yellow dog Updater, Modified)
yum install 软件名
yum groupupdate 软件名 (更新指定软件组)
yum remove 软件名 (只能卸载rpm格式的软件)
rpm
查询验证
rpm -qf 查询文件所属软件包
92. 如果要找出 /etc/my.conf 文件属于哪个包 (package),可以执行命令( ) A. rpm -q /etc/my.conf B. rpm -requires /etc/my.conf C. rpm -qf /etc/my.conf D. rpm -q grep /etc/my.conf
rpm包格式:jhjaln-jki-jsj-1.2.3-6.el7.x86_64.rpm 安装包名字jhjaln-jki-jsj——版本号1.2.3-6.—el企业版—适用平台x86_64
rpm -qa 查询所有已安装的软件包
rpm -V
安装
升级
–U options file1.rpm ... fileN.rpm
卸载
–e rpm_name
问题
重复安装
文件冲突
依赖关系
Ubuntu/Debian
apt-get
进程管理
进程管理
查看进程
ps [选项]
UNIX选项
-a 显示系统中与终端相关的(除会话组长之外)所有进程的信息。 -e 显示所有进程的信息。等价于-A。 -f 显示进程的所有信息。 -l 以长格式显示进程信息。
BSD选项
r 只显示正在运行的进程。 u 显示面向用户的格式(包括用户名、CPU 及内存使用情况等信息)。 x 显示所有非控制终端上的进程信息。
GUN长选项
--pid pidlist 显示由进程ID指定的进程的信息。 --tty ttylist 显示指定终端上的进程的信息。
ps -ef 显示系统中所有进程的全面信息
必有基本的bash和ps
ps aux 显示所有终端上所有用户的有关进程的所有信息
查看crond 进程是否在运行 ps –ef |grep crond
显示进程号为2009的进程 ps –p 2009
• USER:该进程属于那个使用者账号的? • PID :该进程的进程ID号。 • ppid 父进程号 • PRI(priority) 内核调度优先级 • %CPU:该进程使用掉的 CPU 资源百分比; • %MEM:该进程所占用的物理内存百分比; • VSZ :该进程使用掉的虚拟内存量 (Kbytes) • RSS :该进程占用的固定的内存量 (Kbytes) • STAT:该程序目前的状态,主要的状态有: R :该程序目前正在运作,或者是可被运作; S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。 T :该程序目前正在侦测或者是停止了; Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态 • START:进程状态 • TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 • TIME :该进程实际使用 CPU 运作的时间。 • COMMAND:该程序的实际指令为什么?
创建子进程的语句是pid=fork( ); 那么如果是在父进程中,pid的值是(大于0的整数值)
top [选项] (动态显示系统进程信息,每5秒一次)
- k [PID] (终止指定进程)
-q 退出top
1.当前时间、系统已运行时间、当前登录系统的用户数和系统平均负载信息; 2.(进程情况)进程总数、运行进程数、休眠进程数、停止的进程数和僵死的进程数。 3.(不同模式下所占CPU时间百分比)运行用户进程、运行内核进程、运行已调整优先级的用户进程、输入/出等待进程、处理硬件中断、处理软件中断、虚拟机被hypervisor偷去的CPU时间。 4.(内存使用情况)平均可用内存、空闲内存、已用内存、共享内存和缓冲内存等。 5.(交换空间使用情况)平均可用交换容量、空闲数量、已使用量和高速缓存数量。 6.各个进程的部分状态字段信息列表。
jobs 查看后台进程 ([作业号] 运行状态 作业名称)
jobs -l 显示所有任务的PID
jobs -p 仅显示进程号
启动进程
手工启动
前台:直接输命令
ctrl+c 将终止前台程序的运行
fg <%int> 将后台中的命令调至前台继续运行
# fg //后台队首的作业调入前台运行 # fg 2 //将队列中的2号作业调入前台运行
如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
后台
bg <%int> 恢复后台挂起的进程在后台继续执行
如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
#bg //将队首的作业调入后台运行 #bg 3 //将3号作业调入后台运行
[命令]& 把命令放到后台执行
ctrl + z 将一个正在前台执行的命令放到后台,并且暂停
实战
前台换后台 使用bg命令将前台进程切换到后台 如 find / -name ‘*.conf’ 用CTRL+Z将前台程序转入后台停止运行 [1] + find / -name ‘*.conf’ # bg 1 //将在后台暂停的进进程能继续 后台换前台 使用命令 fg将后台进程切换到前台运行 如 sleep 200 & 在后台运行 #jobs //查看工作任务 [1] + Running sleep 200 & #fg 1 //切换find到前台运行
调度启动
at [参数] 时间 at > 命令 定时 (只运行一次)
at 的命令中,如果有显示的内容,她不会直接显示,他会发送到邮箱
时间是linux上的时间且忽略秒钟 如果现在是7:58, at now+1minutes :7:21:00 也就是2秒后,不会是一分钟
-m //任务结束后会发送mail通知用户
-f 文件名 //从指定文件中读取执行的命令
atq:显示队列中的作业信息命令
atrm n :删除队列作业的命令
实战
一、三个星期后的下午5点新建文件a.txt at 5pm +3weeks at >touch a.txt at > <EOT> (ctrl+d) //结束作业 job 1 at Mon Jan 4 00:37:00 2021 二、由于机房预计于2021-01-05 停电,我想要在2021-01-05 23:50关机 at 23:50 2021-01-05 at > shutdown –h now at > <EOT> (ctrl+d) //结束作业 job 2 at Tue Jan 5 23:50:00 2021 三、显示at等待队列的作业信息 #atq 1 Mon Jan 25 17:00:00 2021 a root 2 Tue Jan 5 23:50:00 2021 a root 四、删除at等待队列中序号为2的作业 #atrm 2
batch:空闲(系统平均负载低于0.8)
过程跟at一样,不同的是batch不需要指定时间,因为它会自动在系统负载比较低的时候执行
结果不会直接输出,而是由邮件发送到用户
51、执行命令batch -mf test.sh的执行结果是( )。 A)执行test.sh中命令,结果由系统发邮件通知
crontab [-u user] [cronset配置文件] :周期/定时器
–u user //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 ,如果没有指定用户,crontab默认修改的是当前用户的crontab
-r 删除目前的时程表
-l 查看crontab后台任务
比如 root查看自己的cron设置:crontab –u root –l 再例如,root想删除student的cron设置:crontab –u student –r
启动: /sbin/service crond start
监视配置文件:/etc/crontab
#crontab [-u user] crontab配置文件 crontab 配置文件,每一行都代表一项任务,文件格式如下: minute hour day month dayofweek command 0-59 0-23 1-31 1-12 0-7 命令 在以上各个字段中,还可以使用以下特殊字符: 星号(*):代表所有可能的值,任何时刻都接受的意思。例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,要执行的工作是3:00与6:00时,表示为:0 3,6 * * * 命令 中杠(-):可以用整数之间的中杠表示一个整数范围,例如8点到12点之间的每小时的20分钟都进行一项工作,表示为 20 8-12 * * * 命令 正斜线(/):可以用正斜线指定时间的间隔频率,例如“*/5”表示每5分钟进行一次,也可以写成0-59/5
详解: minute hour day month dayofweek (username) command * * * * * 命令1(*代表任意值,都是*代表每分钟执行一次) */5 * * * * 命令1(每5分钟执行一次) 43,45 8-12 * * * 命令1 (每天8:43 8:45 9:43 9:45 10:43 10:45 11:43 11:45 12:43 12:45 各执行一次)
示例1: 编辑一个cronset配置文件,用crontab命令实现每小时的30分钟时自动检查登录系统的用户并保存到mysyslog日志文件中。 #cat > cronset (这里也可以用 vi cronset 输入以下内容,也可以先用touch再用vi) 30 * * * * who >>mysyslog <EOT> #crontab cronset #crontab -l 示例2: 用crontab –e命令建立一个crontab配置文件,每隔3分钟显示日历 #crontab -e */3 * * * * cal 保存退出 示例3: 假如你的女朋友生日是5月2日,你想要在5月1日的23:59发一封信给她,这封信的内容已经写在/home/student/lover.txt内了,该如何进行? 答:直接执行crontab –e之后,编辑成为: 59 23 1 5 * mail baobao < /home/student/lover.txt 这样的话,每年她都会收到你的这封信。(当然,信的内容你自己改变)
时间表示方法
绝对
midnight //当天午夜 moon //当天中午 teatime //当天下午4点 hh:mm (AM,PM) mm/dd/yy(yy-mm-dd或者dd.mm.yy)
相对
now+n minutes //从现在起向后n分钟 now+n days //从现在起向后n天 now+n hours //从现在起向后n小时 now+n weeks //从现在起向后n周 Today \ tomorrow
进程调度命令
终止
ctrl+c 终止前台进程
kill [-s 信号|-p ] [-a] pid 终止后台进程
-s signal (默认是15,有线信号)
1 HUP: hangup
2 INIT: 相当于 Ctrl + c
9 KILL
15 TERM: Terminate (kill 的默认信号)
18 CONT: Continue (从STOP信号中恢复)
19 STOP: Stop
-l 显示信号名称列表,它也可以在/usr/include/linux/signal.h文件中找到。
说明:只有第9种信号(KILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号: HUP 1 终端断线 INT 2 中断(同 Ctrl + C) QUIT 3 退出(同 Ctrl + \) TERM 15 终止 KILL 9 强制终止 CONT 18 继续(与STOP相反, fg/bg命令) STOP 19 暂停(同 Ctrl + Z)
kill -9 PID (强制杀死该进程)
信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态等。
init进程不可杀
优先级
nice -n [-20~19] 改变进程优先级
优先数越小,其优先级越高。 但一般用户只能设定正值,从而主动降低其优先级,只有特权用户才能把nice的值置为负数。
ps -l查看进程优先级
renice [-20~19] [PID] 设置已经运行的进程优先级
nohup
可以在用户退出帐户/关闭终端之后继续运行相应的进程。
wait [进程号 或 作业号] 用来阻塞当前进程的执行
概念
进程:多道程序并发执行的过程,是动态的。
进程状态
(新建)就绪->运行 运行->阻塞 阻塞->就绪 运行->就绪(终止)
运行态:已分配到CPU,正在执行。任何时刻处于运行状态的进程至多有一个
就绪态:(进程已具备运行条件,一旦把CPU分配给它,就可以立即运行)
阻塞态:不可运行状态/挂起状态(进程因等待某个条件例如某一输入、输出操作完成,而暂时不能运行的状态)
进程分类
交互式进程(用户进程):由某种shell程序启动的进程,如执行一个命令。交互进程既可以在前台运行,也可以在后台运行。
批处理进程(系统进程):这种进程和终端没有联系,但它是一个进程系列。例如执行一个shell脚本程序。
监控进程(守护进程):它是在Linux 系统启动时运行的进程,并且运行在后台。优先级低于前台进程
后台进程:放入后台执行的命令,只能在当前登录终端执行,一旦退出或关闭终端,后台进程将会停止。
前台进程:用户使用的有控制终端的进程。
Linux后台进程与前台进程的区别 前台进程可以操作,后台进程不能操作(除了把它关闭). 前台进程不全是由计算机自动控制,后台进程全都是由计算机自动控制. 特征: 1,前台进程可以以窗口,对话框的形式在系统中显示.后台进程不行. 2,在任务栏中点亮的进程都可以称为前台进程.没点亮的为后台进程. 3,前台进程和后台进程有时候可以互相转换.
进程特征
动态性
调度性
异步性
结构性
并发性
并行性
线程:是进程中实施调度和分派的基本单位。
程序是指令的有序集合,是永久存在的,是一个静态的概念
磁盘管理
特点
1.一切皆文件 2.无后缀无回收站 3. 严格区分大小写
linux文件系统XFS
主分区
ext2
ext3
拓展分区
逻辑分区
常用管理命令
1.创建磁盘分区
在安装Linux系统时,至少要创建的分区是( )。 A) 主分区与SWAP分区
fdisk [选项] [设备]
fdisk -l 查看分区情况
-n:添加分区
-l 逻辑
-e 拓展
-p 主分区
-q:不保存退出
-w:保存退出
-d:删除磁盘分区
实战
如果光盘未经卸载,光驱是打不开的
2.(格式化)创建文件系统
mkfs [选项] [设备]
常用选项:-t<文件系统类型> 表示指定文件系统类型。默认的文件系统是ext系列
例1:格式化/dev/sdb1分区,创建ext3文件系统 #mkfs –t ext3 /dev/sdb1 例2:格式化/dev/sda5分区,创建xfs文件系统 #mkfs –t xfs /dev/sda5
实战
3.挂载
挂载:相当于给硬盘开个门,告诉用户哪里可以找到这个硬盘。 挂载到某个目录,那个目录就是门的名字,类似C盘,D盘,E盘 文件系统:硬盘存储数据,组织管理的方法
修改文件系统表/etc/fstab
device mnt type options dump passno 文件系统标号或所在设备 文件系统挂载点 文件系统类型 安装选项,用逗号分开 两次备份之间的时间 根系统1/其他2/未指定0
/dev/sdb3 /mnt/niupi ext4 defaults 设备 挂载点 系统类型 安装选项
mount
mount -t [文件类型] [设备] [挂载目录]
mount -a 永久生效
装载所有在 /etc/fstab 中定义的文件系统
用mount、fdisk –l、df –h 查看是否挂载成功
4.卸载
umount
从当前系统中卸载一个已装载的文件系统
umount命令永远不能卸载一个正在工作状态中的文件系统
示例1:卸载磁盘分区/dev/sda5文件系统 # umount /dev/sda5 示例2:卸载/mnt/www目录所在的磁盘分区文件系统 # umount /mnt/www
vi /etc/fstab 去删掉卸载的那一行的信息
维护
检查
fsck [选项] file_system […]
例如,要检查/dev/sda1分区上的文件系统,可以用以下命令: # fsck /dev/sdb1
查看磁盘
df [选项] [目录/文件名]
df -ah /mnt/niupi
df -h (人性化)可以查看磁盘的挂载点
df -a 显示所有,把不占用磁盘空间的文件系统也列出来。
du (可用ls代替)
du -h (人性化显示当前目录大小)
du -a
du -ah (显示目录下所有文件大小)
实战
子主题 1
磁盘配额管理
edquota
-g
-u
quota
quotacheck
基础知识
总过程:硬盘 --》 分区 --》 格式化(创建文件系统) --》 挂载
硬盘
磁头(head)、 磁道(track)、 柱面(cylinder)、扇区(sector)、 圆盘(platter) 8M/柱面
接口
IDE
hdxx
hda
hda1
hda2
hda3
....
hdb
hda5 (无论有没有hda3,hda4,第二个逻辑分区编号直接从5开始算)
hdc
......
SATA USB SCSI
sdxx
sda
sda1
sda2
.......
sdb
sdc
.....
对hda1的解释: hd:IDE硬盘。如果是SCSI硬盘,则为sd,这个只能记住,没有更好的办法。 a:: 第一块硬盘。如果是第二块硬盘,则为b,依此类推c,d…… 1: 主分区。其中1,2,3,4都是主分区(或扩展分区, 主分区+扩展分区<=4, 这是因为硬盘有64字节描述分区,每一个占用16字节),从第5开始为逻辑分区,最大到16,新的Linux版本无限制
磁盘容量与主分区、扩展分区、逻辑分区的关系: 硬盘的容量=主分区的容量+扩展分区的容量 扩展分区的容量=各个逻辑分区的容量之和 一块物理硬盘只能有: 一到四个主分区(但其中只能有一个是活动的主分区),或一到三个主分区,和一个扩展分区。分别对应hda1,hda2,hda3,hda4.
MBR分区方案
分区最大的好处:可以放多个相同内容
要么4个主分区,0个拓展分区,或者3个主分区1个拓展分区
交换分区(swap分区):虚拟内存,起缓存作用
逻辑分区和主分区才能存放数据
主分区不可再分,拓展分区可再分为逻辑分区,且没有限制
在安装Linux系统时,至少要创建的分区是 SWAP分区与根分区
格式化
文件系统:硬盘存储数据,组织管理的方法
windows下常见的文件系统:HTFS、VFAT
挂载
挂载:告诉用户哪里可以找到这个硬盘,于给硬盘开个门,指定挂载到某个目录,那个目录名就是门的名字。(类似C:盘 D:盘)
linux编程
Linux环境下C语言程序开发过程 1.用编辑程序(vi/vim、Emacs)编辑源程序,生成源程序文件; 2.使用编译软件Gcc对源程序文件进行编译,可生成执行文件; 3.使用GDB调试器软件对程序进行调试; 4.生成最终可执行程序。
源文件-> 预处理-> 编译-> 汇编-> 链接-> 可执行程序
预处理选项
1.预处理阶段 预处理程序(Preprocessor)读取C语言源文件,对其中以“#”开头的指令(伪指令)和特殊符号进行处理。 伪指令主要包括文件包含、宏定义和条件编译指令。 (1)在C程序中,文件包含有两种形式: #include <文件名> 预处理程序在/usr/include目录下寻找指定文件; #include “文件名” 预处理程序首先在当前目录寻找指定的文件,找不到时再到/usr/include目录下寻找。 (2)在C程序开头,往往有很多宏定义,例如: #define EOF –l #define MAX 100 条件编译指令(如#ifdef,#ifndef,#else,#elif,#endif等)
编译选项
2.编译阶段 编译程序(Compiler)对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分。在确定各成分都符合语法规则后,将其“翻译”为功能等价的中间代码表示或者汇编代码。
3.汇编过程 汇编程序(Assembler)把汇编语言代码翻译成目标机器代码的过程。 目标文件由机器码构成。通常它至少有代码段和数据段两部分。前者包含程序的指令,后者存放程序中用到的各种全局的或静态的数据。
对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分。在确定各成分都符合语法规则后,将其“翻译”为功能等价的中间代码表示或者汇编代码。
优化选项
链接选项
4.连接阶段 连接程序(linker)要解决外部符号访问地址问题,也就是将一个文件中引用的符号(如变量或函数调用)与该符号在另外一个文件中的定义连接起来,从而使有关的目标文件连成一个整体,最终成为可被操作系统执行的可执行文件。 连接模式分为: 静态连接 动态连接。
静态连接是在编译时把函数的代码从其所在的静态链接库(通常以.a结尾)或归档库文件中复制到可执行文件中,从而在程序执行之前它已被连成一个完整的代码。
动态连接是将函数的代码放在动态链接库(通常以.so结尾)或共享对象的某个目标文件中,在最终的可执行文件中只是记录下共享对象的名字及其他少量相关信息。在执行该文件时,如涉及函数外部访问,才把函数代码从动态链接库中找出,连入可执行文件中。
gcc(GNU Compiler Collection,GNU编译器套件)
通过文件后缀进行区分
gcc hello.c
生成 a.out
gcc –c hello.c
生成 hello.o (.o结尾表示经过汇编后的目标文件)
使用gcc将C语言源代码文件进行汇编生成.o后缀的目标文件
预处理选项
-D name
预定义一个宏name,而且其值为1;
-D name=definition
预定义一个宏name,并指定其值为definition所指定的值。其作用等价于在源文件中使用宏定义指令:#define name definition。但-D选项比宏定义指令的优先级高,它可以覆盖源文件中的定义;
-U name
取消先前对name的任何定义,不管是内置的,还是由-D选项提供的;
-I dir
指定搜索头文件的路径dir。先在指定的路径中搜索要包含的头文件,若找不到,则在标准路径(/usr/include, /usr/lib及当前工作目录)上搜索;
-E
只对指定的源文件进行预处理,不做编译,生成的结果送到标准输出。
编译选项
-c
只生成目标文件,不进行连接。用于对源文件的分别编译
-S
只进行编译,不做汇编,生成汇编代码文件格式,其名与源文件相同,但扩展名为.s
-o file
(重命名)将输出放在文件file中。如果未使用该选项,则可执行文件放在a.out中
-g
(调用gdb)指示编译程序在目标代码中加入供调试程序gdb使用的附加信息
-v
在标准出错输出上显示编译阶段所执行的命令,即编译驱动程序及预处理程序的版本号
优化选项
-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-On,n为0-3的整数,进行0级到3级优化。
连接选项
-c -S -E
如果使用其中任何一个选项,那么都不运行连接程序,而且目标文件名不应该用做参数
-llibrary
连接时搜索由library命名的库。连接程序按照在命令行上给定的顺序搜索和处理库及目标文件。实际的库名是liblibrary.a
-static
在支持动态连接的系统中,它强制使用静态链接库,而阻止连接动态库;而在其他系统中不起作用
-Ldir
把指定的目录dir加到连接程序搜索库文件的路径表中,即在搜索-l后面列举的库文件时,首先到dir下搜索,找不到再到标准位置下搜索
-Bprefix
该选项规定在什么地方查找可执行文件、库文件、包含文件和编译程序本身数据文件
gdb程序调试工具
print命令(其缩写形式为p):查看运行时的数据 1.取值或取变量的值 例如:print i (或p i) (显示当前变量i的值) print i*j(或p i*j)(根据程序运行的情况显示出i*j的值) 2.用&运算符取出变量在内存中的地址 如:print &i (显示变量i的存放地址) print &array[i](显示数组array第i个元素的地址) 3.{type}adrexp 表示一个数据类型为type、存放地址为adrexp的数据 4.@是一个与数组有关的双目运算符 如:print array@10(表示打印从array数组的基地址开始的10个值) print array[3]@5(表示打印从array第三个元素开始的5个数组元素的数值)
break命令(其缩写形式为b)设置断点: break 函数名 (在指定函数名的入口处设置断点) 例如:break main info break(查看断点) break 行号 (在当前文件指定行设置断点,停在该行开头) 例如:list (查看行号) break 6 info break(查看断点) break 文件名:行号 (在指定文件的指定行上设置断点) 例如:break test.c :10 info break(查看断点) break 行号 if 条件 (在当前文件指定行处设置断点,但仅在指定条件表达成立时才停止程序执行) 例如: break 8 if i=10 info break(查看断点) break 文件名:函数名 (在指定文件的指定函数的入口处设置断点) 例如:break test.c :main info break(查看断点) break (不带任何参数,则表示在下一条指令处停止) 显示断点命令 info break [断点编号] 该命令会列出当前所有断点的信息。 删除断点命令 delete [断点编号] 如果要删除多个断点,则各个号码间用空格分开。如果delete命令后面不带参数,则删除所有的断点。
$ gcc -g prog.c -o prog
使用GDB调试器对程序进行调试之前,在编译时一定要加 -g
错误按其性质可分为三种:
(1)编译错误,即语法错误。主要是程序代码中有不符合所用编程语言语法规则的 错误。
(2)运行错误。如对负数开平方,除数为0,循环终止条件永远不能达到等 。
(3)逻辑错误。这类错误往往是编程前对求解的问题理解不正确或算法不正确引起的,它们很难查找。
查找程序中的错误,诊断其准确位置,并予以改正,这就是程序调试。
gdb是对用C、C++等高级语言编写的程序进行调试的工具
make
在 Linux环境下使用 GNU 的 make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。
Makefile
make在执行时,需要一个命名为Makefile的文件。Makefile文件描述了整个工程的编译,连接等规则。其中包括: 工程中的哪些源文件需要编译以及如何编译; 需要创建那些库文件以及如何创建这些库文件、如何最后产生我们想要得可执行文件。
安装一些大型的软件都是用makefile
makefile要跟源文件在一起,不能用重复名
makefile编写规则
Makefile管理整个工程的编译、链接、执行、清除等一系列活动的规则。Makefile文件由一系列规则组成,Make工具读取这些规则所指定的行为进行操作。规则如下: 目标:依赖文件列表 <TAB>执行命令 目标:在Makefile 中,规则的顺序是很重要的,因为,Makefle中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefle中的目标可能会有很多,但是第一条规则中的目标将被确立为最终的目标。
例子:程序文件:main.c hello1.c hello2.c。 /*hello1.c*/ #include <stdio.h> void hello1 () { printf(“This is hello1 !\n”); } /*main.c*/ #include <stdio.h> void main() { hello1(); hello2(); } /*hello2.c*/ #include <stdio.h> void hello2 () { printf(“This is hello2 !\n”); }
基本工作原理及过程
在默认情况下,Make工具从Makefile文件中的第一个目标开始,第一个目标称为默认目标。 在第一个例子中,默认目标是更新可执行程序main,因此作为第一条规则。 执行make命令时,读取当前目录的Makefile文件,从第一条规则开始处理。该规则是将main.o链接成为可执行程序,但在执行命令前,make必须处理该规则所依赖的其他规则。 生成main依赖main.o hello1.o hello2.o这3个目标文件,然后这些文件根据他们的规则进行处理。
make用法
Make命令选项参数常用用法: -f:指定Makefile文件的名称,例子: make –f mymakefile -n: 显示更新目标,但不真正执行该命令。 -t: 将目标标记为已更新,但实际上并没有真正更新目标程序。 -q: 判断某个目标是否已更新。 -C dir:表示在读取Makefile时更改当前目录到dir -d: 显示make执行过程中的调试信息。 -I dir:指定搜索路径包含的Makefile文件的目录。
vi编辑器(visual interface) /vim是vi的增强版本
命令模式 (ESC)(默认)
在命令行模式下才能用ctrl+Z
撤销 按u
还原到一开始 U
回复 ctrl+r
在vi编辑器的命令模式下,命令的组成格式是:nnc,其中,字符c是命令,nn是整数值 用h、j、k、l移动光标位置
yy 将光标所在行的内容复制到通用缓冲区,该命令也称为抽取。 p 取出通用缓冲区中的内容放在光标所在位置的后面,即粘贴。 nyy 复制多行,如3yy,复制光标所在行及其后面两行 的内容。
▲如果在相应命令的前加一个数字n ,就把光标相应移动n个字符。 例如: 6l,则向右移6个字符(但不能跨行); 4h ,则向左移动4个字符 (但不能跨行); 3+,则向下移3行,光标位于行首; 6k ,则光标上移6行,列数不变。
移动至行首 ^ /0 (记得加shift)
行尾 $
指定行 命令nG将光标移至第n行的开头;
翻页
向上翻:ctrl+u
向下翻:ctrl+d
跳到某一行为开头(类似clear)[行号] z [行数] <回车>
显示百分比:ctrl+G
重复命令 .
注意:.是重复执行刚才在编辑模式下的一切命令,只要刚才没有按esc的所有命令都会被重复执行
字符串检索
/ 表示从当前光标位置开始向后查找
?表示从当前位置开始向前查找
用h、j、k、l移动光标位置
文本输入模式/编辑模式 (按a,i,s,c,o,insert键)
输入vi的插入命令( i )、附加命令( a )、打开命令(o )、替换命令( s )、修改命令( c )或取代命令( r )可以从命令方式进入到插入方式。
vi提供了多种插入和添加命令: i 在光标前插入字符。 I 在当前行的行首插入字符。 a 在光标后添加字符。 A 在当前行的行尾添加字符。 o 在当前行后添加新行。 O 在当前行前添加新行。 s 删除光标位置的一个字符,然后进入插入模式 S 删除光标所在的行,然后进入插入模式
i 当前光标
a 光标后插入
A 段尾插入
o 相当于回车
行模式/转义模式 (/?)
:q 不保存退出
:q! 不保存强制性退出。感叹号(! )告诉vi,无条件退出,丢弃缓冲区内容
:wq /:x 保存退出
文本处理复制粘贴等
行模式按esc不明显,可以按shift清空再删掉就明显了
:set number显示行号
set nonumber 取消显示
:f 显示文件名
设置vi
全局的配置文件位于“/etc/vim/vimrc”。
用户个人“~/.vimrc”。
vi -R 以只读的形式打开(类似cat)
shell编程
概念
语法及常用函数
sleep 时间值 (常用于两条命令执行之间停顿指定的时间)
在时间值后面可以有以下后缀: s———表示秒数(默认); m———表示分钟; h———表示小时; d———表示天数。 时间值不必是整数,可以是任意的浮点数。
echo
将命令行中的参数显示到标准输出(即屏幕)上,默认添加换行符
-e 解释\转义字符 (\n有效)
-n 禁止换行
-E 使后面的转义字符失去作用。(与-e相反)
注释:(在前面加"#"号)
Shell程序的第一行最好为:#! /bin/bash
read [选项] [存放变量]
读取文件内各个域的内容并将其赋值给Shell变量
-a 数组名 (默认使用空格为分隔符)
-n 只允许输入n个字符
-p 提示语
相当于在read之前加了echo 提示语
-s 输入的字符不提示(密码)
-t 限制输入时间
变量个数M与输入数据N个数之间的关系:
M=N,一一对应赋值 $ read x y z Today is Monday $ echo $z $x $y Monday Today is
M<N 从左到右赋值,剩余的数据都赋给最后一个变量。 $ read n1 n2 n3 First Second Third 1234 abcd $ echo $n3 Third 1234 abcd $ echo $n2 $n1 Second First
M>N 从左到右赋值,没有数据对应的变量取空串。 $ read n1 n2 n3 1 2 $ echo $n3 $ echo $n1 $n2 1 2
实战
【例7.7】判断给定的某一年是否是闰年。大家知道,如果某年号能被4 整除而不能被100整除、或者能被400整除,那么它就是闰年;否则是平年。 $ cat leapyear #!/bin/bash echo "Input a year number" #提示输入一个年号 read year #读取输入的年号 let "leap=year%4==0&&year%100!=0||year%400==0" #计算给定年号是闰年吗? if [ $leap –eq 0 ] #若leap等于0,则不是闰年 then echo "$year is not a leap year. " #输出不是闰年信息 else echo " $year is a leap year. " #否则,输出闰年信息 fi $ leapyear Input a year number 2008 (用户输入一个年份) 2008 is a leap year. (显示运行结果)
open
open命令用于打开文件,使用时需要引用头文件<fcntl.h>
1是标准输出流
2是标准错误流
0是标准输入流
其他文件从3开始递增。
若失败,返回-1,否则返回正整数
open(“myfile.txt”,O_RDONLY);
打开一个文件myfile.txt,只可以对该文件进行读操作
exit() #退出当前shell 有返回值,类似C语言的return,exit 0 正常退出
【例7.9】这个程序用来展示测试语句应用。 $ cat exam10 echo -n 'key in a number (1-10 ) : ' #输入一个数字,光标不换行 read a #读取输入的数字 if [ "$a" -lt 1 -o "$a" -gt 10 ] #如果该数小于1或者大于10 then echo "Error Number ." #显示输入数字有错 exit 2 #退出,返回码为2 elif [ ! "$a" -lt 5 ] #否则,若该数不小于5 then echo "It’s not less 5. " #显示不小于5 的信息 else echo "It’s less 5. " #否则,显示该数小于5 fi #结束if语句 echo "accept key in value." #显示接受了键入的值
流程控制
顺序
在顺序结构中,直接写函数名就是执行该函数
分支结构
运算符
整数比较运算符
在shell中没有"> < ="号 -lt(小于) -le -gt -ge -eq -ne
例子:排序 read a read b if [ $a –lt $b ]; then echo “$a $b” else echo “$b $a” fi
0:true 1:fault
字符串比较运算符
在shell中没有"> < ="号 ,用英文缩写litter than great than equal -lt(小于) -le(小于等于) -gt(大于) -ge(大于等于) -eq(等于) -ne(不等于)
文件属性判断运算符
逻辑运算符
优先级: !> -a > -o
(test 表达式)/[ 表达式 ]
test命令用于测试字符串,文件状态和数字等条件是否成立。结果为0或1(fault),存储在$?中
文件状态测试命令使用示例 [root@localhost root]#test -d /etc [root@localhost root]#echo $? 0 [root@localhost root]#[ –f /etc/inittab ] [root@localhost root]#echo $? 1
$?默认为0(上一条命令执行成功后的返回值)
用 [ 表达式 ] 时中表达式两边必须要有空格,
-n $n 判断n是否为空字符
-e filename 判断文件是否存在
-d "dirname" 判断目录是否存在
\(空格 表达式 空格 \): 分组括号
实战
[ "Sum" -gt 10 -a "Sum" -lt 20 ] = test "Sum" -gt 10 -a "Sum" 判断sum是不是在10到20之间
[ "Sum" = y -o "Sum" =Y ]不区分sum是大写还是小的Y
test ! -d "/etc/init.d" 判断/etc/init.d 是不是目录
test \( $a=0 \) -a \( $b=0 \) -a \( $c=0 \) -a \( $d=0 \) 判断abcd是不是均为0
if
简单格式
if (test expression) then commands fi
i=/home/student/abc if test -f "$i" then echo "$i is an ordinary file . " fi
if [ expression ]; then commands fi
多个条件,建议养成结尾带;的习惯
完整格式
if [ expression ]; then commands_true else commands_false fi
嵌套格式
if [ expression1 ]; then commands1 elif [ expression2 ]; then commands2 else commands3 fi
实战
要求:从键盘输入考试分数,如果小于0或大于100,显示“error,number: 0-100 ”,正常退出程序;如果大于等于90分,显示“A”;如果大于等于80分,显示“B”;如果大于等于70分,显示“C”;如果大于等于60分,显示“D”;如果小于60分,显示“F”。
case
1.取值后面必须为单词in,每一模式必须以右括号结束。 2.取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。 3.取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式匹配检测。 4.如果无一匹配模式,使用星号 * 捕获该值。
case 值 in 模式1)命令1;; 模式2)命令2;; …… *)命令x esac
实战
编写一个程序,执行时由用户从键盘输入字符,程序判定字符的类别。 #! /bin/bash echo -n Please input a char: read x case $x in [0-9]) echo “digit” ;; [a-z]) echo “lowercase letter” ;; [A-Z]) echo “uppercase letter” ;; ?) echo “special character” ;; *) echo “Please type a single character” exit 2 ;; esac
编写一个名为month的程序,执行时由用户输入数字作为命令行参数,程序将数字转换成英语的月份单词并输出。 #! /bin/bash if test $# -ne 1 then echo "Usage: month digit" exit 1 fi case $1 in 1) echo January;; 2) echo Feburary;; 3) echo March;; 4) echo April;; 5) echo May;; 6) echo June;; 7) echo July;; 8) echo August;; 9) echo september;; 10) echo October;; 11) echo November;; 12) echo December;; *) echo "Bad argument,nust in range 1--12"; exit 2;; esac
循环结构
for
for 变量名 in [列表/正则表达式或$*(位置参数)] do 命令1; …… done
实战
#!/bin/bash for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday do echo "The day is : $DAY" done
遍历数组中的元素 #! /bin/bash arr=(sunday monday tuesday wednesday thursday friday saturday) for item in ${arr[*]} do echo "the day is :$item" done
for ((变量=初始值; 条件判断; 变量变化)) do 语句; done
((条件判断 )) 括号内的条件判断直接<>=,不用gt lt lt那些
实战
例子: #!/bin/bash for ((i=0; i<10; ++i)) do echo $i done
九九乘法表: #! /bin/bash for ((i=1;i<10;i++));do for ((j=1;j<i+1;j++));do echo -ne “\t$i*$j=$((i*j)) done echo done
20以内的偶数: for ((i=0;i<20;i++));do #当i小于20的时候就i+1 num=$(($i % 2)) #将$i除以2取出余数 if [ $num -eq 0 ];then #判断余数的结果是否等于0 echo $i #显示出来0-20能除以2余数为0 fi done
while
while [ expression ]; do commands done
当......执行
实战
#! /bin/bash count=10 while [ $count -gt 0 ] do echo $count ((count=$count - 1)) done
从1加到100: **************************使用while语句: #! /bin/bash i=1 sum=0 while [ $i -le 100 ]; do sum=$[$sum+$i] i=$[$i+1] done echo $sum **************************使用until语句: #! /bin/bash i=1 sum=0 until [ $i -gt 100 ]; do sum=$[$sum+$i] i=$[$i+1] done echo $sum
until
直到......才停止(用于结果多,结果先出)
编写一个程序,依次输出10、9、8、7、6。 #! /bin/bash i=10 until [ $i -le 5 ] do echo $i ((i--)) done
break n (n为可选的命令选项,表示跳出几层循环)
当执行break语句时,退出当前的循环层并执行当前循环层done之后的命令。如果指定可选项n,则退出n层的循环,n的值必须大等于1(默认值为1)。如果n的值大于循环层数,则退出所有的循环。
continue
挂起这次循环,直接跳出下一次循环
编写一个程序,在屏幕上输出0到指定数之间的所有偶数。 #! /bin/bash echo -n Please input the number: read num i=1 while test $i -le $num do if test `expr $i \% 2` -ne 0 then i=`expr $i \+ 1` continue fi echo $i i=`expr $i \+ 1` done
#! /bin/bash echo -n "please input the number:" read num i=1 while [ $i -le $num ]; do a=$[$i%2] if [ $a -eq 0 ]; then echo -n " $i" fi i=$[$i+1] done
定义函数
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分
function 函数名 { 命令 …… }
子主题 1
函数名( ) { 命令 …… }
调用
在shell脚本中直接打函数名就行
hello( ) { echo “Today’s date is `data`” } echo “Now going to the function hello.” hello echo “Back from the function hello.” 示例中的前4行定义了hello函数,第6行调用hello函数(仅使用函数名即可)。
函数名 参数1 参数2 参数3...... (函数名后面不需要括号)
#!/bin/bash printMsg() { echo "$1:$2" } printMsg aaaa bbbb
递归
编写一个程序,其中定义阶乘函数jc,在程序中递归调用它计算阶乘。 #! /bin/sh - if test $# -ne 1 then echo "factorial argument" exit 1 fi i=$1 x=$1 jc() { i=`expr $i - 1` x=`expr $x \* $i` if test $i -ne 1 then jc #函数jc递归调用 fi } jc echo $x
特殊字符
双引号(")
由双引号括起来的字符均作为普通字符对待。(除$、倒引号(`)和转义字符(\)外)
“\”作为转义字符的条件:其后的字符必须是$、`、"、\或换行符。
单引号(')
由单引号括起来的所有字符都作为字符串
倒引号(`)
倒引号里的被当做命令且优先执行
shell变量(写在sh文本文件中)
系统变量
$# ——除脚本名外,命令行上参数的个数。 在脚本文件中写echo $# sh test.sh 1 2 3 ->3
$?——上一条前台命令执行后的返回值(也称“退出码”,一般返回0)。 0表示执行成功,其他数字有各自的含义
$$——当前进程的进程号。 本程序的PID
$!——上一个后台命令对应的进程号
$*(或@)变量
存放所有输入的命令行参数,并且每个参数之间用空格分隔。 echo $*/@ sh test.sh x y z x y z
$n 位置参数
$0 表示程序名 $1表示第一个参数 $2表示第二个参数 $3表示第三个参数 .......
shift [n] (n非0,默认为1)
shift命令的功能是使第一个命令行参数无效,并将位置变量2的值移给位置变量1,将位置变量3的值移给位置变量2,…,将位置变量10的值移给位置变量9。该命令不会改变位置变量0的值。
即:把前n位去掉(不包含名字0),后面的数向前填充
实战
#!/bin/bash echo $0 $1 $2 $3 shift echo $0 $1 $2 $3 shift 2 echo $0 $1 $2 $3 [root@localhost ~]# sh niupi2.sh 10 20 30 40 50 60 niupi2.sh 10 20 30 niupi2.sh 20 30 40 niupi2.sh 40 50 60
环境变量(为了在任何地方可以找到命令)
(1)HOME:用户主目录的全路径名。如/home/myname (2)LOGNAME:即用户注册名 (3)PWD:当前工作目录的路径。 (4)PATH:shell查找命令的路径(目录)列表,各个目录用冒号(:)隔开。当命令输入时,Shell将读取系统环境变量PATH的内容。这些内容中有包含可执行文件的目录列表
#!/bin/bash echo $PATH (/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin) echo $LANG (zh_CN.UTF-8) echo $SHELL (/bin/bash) echo $HOME (/root) echo $LOGNAME (root)
/bin 目录就是专门用来存放可执行命令的
临时添加(shell终端关闭即失效)
export/env
[root@mail ~]#export PATH=$PATH:/usr/local/php/bin 为php环境 [root@mail ~]#export PATH=$PATH:/usr/local/mysql/bin 为mysql环境
永久添加
用户 vi ~/.bash_profile (linux下每个用户宿主目录下都有一个 ~/.bash_profile文件)
全局 vi /etc/profile
在末行输入 export 环境变量名=$PATH:路径/bin
如果想要让root在任何目录均可以执行/niupi下面的ls,那么就将/niupi加入PATH当中即可 # PATH=”$PATH: /niupi”
soure /etc/profile (变量生效)
常见问题
1.千万记得路径后面加:$PATH export PATH=/java/jdk.1.8.0_161/bin:$PATH不能export PATH=/java/jdk.1.8.0_161/bin,否则报废 2.另外加入路径的时候用绝对路径。 3.需要写入变量的时候,可以先用set 或者 export设置临时变量来确定,没有问题再写入变量脚本文件里面。
实战(linux设置java环境变量)
1.准备jdk源码包,我这里使用的是jdk-7u80-linux-x64.gz,请自行下载各自所需版本。 2.使用tar -zxvf jdk-7u80-linux-x64.gz 解压源码包,将其cp到存放位置,我这里使用的是/data/local/kdh/java/jdk1.7.0_80 3.配置环境变量,使用vi /etc/profile ,在末尾处添加以下四行代码: export JAVA_HOME=/data/local/kdh/java/jdk1.7.0_80 export JRE_HOME=/data/local/kdh/java/jdk1.7.0_80/jre export PATH=$PATH:/data/local/kdh/java/jdk1.7.0_80/bin export CLASSPATH=./:/data/local/kdh/java/jdk1.7.0_80/lib:/data/local/kdh/java/jdk1.7.0_80/jre/lib 4.使用source /etc/profile 使其生效 5.使用javac或java -version 验证是否配置成功;
用户变量
定义和赋值: 变量名=字符串 (a=1)
1.在赋值号“=”的两边没有空格 2.严格区分大小写,变量名以字母或下划线打头的字母、数字和下线符序列,大小写字母意义不同。
3.如果在赋给变量的值中含有空格、制表符或换行符,那么,就应该用双引号把这个字符串括起来。
引用变量:$变量名
数组
创建赋值
数组名=(值1 值2 值3) 下标由0开始,中间用空格隔开 arr =(a b c)
赋值 arr[3] =d
!/bin/bash arr=(a b c) arr[5]=d echo ${arr[0]} echo ${arr[5]} echo ${arr[3]} echo ${arr[*]}
declare -a 数组名
赋值:数组名[下标]=值
$ city[0]=Beijing $ city[1]=Shanghai $ city[2]=Tianjin
读取: ${数组名[下标]}
使用*或@作为下标,则表示数组中所有元素 打印所有数组元素:${数组名[*]} 或 ${数组名[@]}
unset 取消对一个数组的定义
基本结构
1.vi 建立txt文件.sh
子主题 1
2.执行shell
sh 脚本名 [参数]
chmod a+x ex2
•/ 脚本名 [参数] (./后不需要空格)
3.单词倒着写相当于反括号
测试脚本是否有语法错误:bash -n 脚本 例如:bash -n filetest.sh
脚本单步执行(很实用):bash -x 脚本 例如:bash -x filetest.sh
实战
#!/bin/bash #证明是bash文件 echo "Hello World !"
【例7.10】编写脚本,求费波纳奇(Fibonacci)数列的前10项及总和。 1,1,2,3,5,8,13,21,34,55 $ vi exam11 #!/bin/bash #说明本脚本是用bash编写的 a=1 #变量a存放奇数项的值,初值为1 b=1 #变量b存放偶数项的值,初值为1 echo –n –e "$a\t$b" #显示a和b的值。光标不换行 let "n=a+b" #变量n存放a与b之和 count=4 #变量count表示循环次数,初值为4。为什么? while [ $count –gt 0 ] #当count值大于0时,则进入循环体 do #下面是循环体 let "a=a+b" #计算前一项的值 let "b=b+a" #计算后续项的值 echo –n –e "\t$a\t$b" #显示刚计算出的这两项的值 let "n +=a+b" #计算总和 let "count=count-1" #循环次数减1 done #循环体结尾 echo #输出空行 echo "The sum is $n" #显示总和 $ sh exam11
运算符
其运算符及其优先级和结合性基本上与C语言的相同。 还提供了方乘方运算符“**”,其优先级比*、/高一级。
let "算术表达式" (值必须用变量保存起来)
let "i=1+2"; echo $i 相当于:((i=1+2));echo $i
(( 算术表达式 )) 可以不用变量
只有使用$((算术表达式))形式才能返回表达式的值
echo $((1+2))
$ echo "((12*9))" ((12*9)) $ echo "$((12*9))" 108
echo $((2**4))
x=2;y=3;echo $(($x +$y)) x与+之间可以空格下,避免被认为x+是变量
expr 空格 值 空格 运算符 空格 值(用于整数值)
注:使用乘号时要用反斜杠进行转义
#expr 10 + 10 #expr 30 / 10 #expr 30 \* 10
bc 专用于小数
echo "5.3*6.1" | bc
bc <<< "表达式"
bc 如果值小于1,则不会显示小数点前的0 [root@localhost ~]# echo "0.5" | bc .5
[空格 表达式 空格]
echo $[ 1+2 ]
实战
定义变量A=40,B=20;从键盘输入选项; 如果输入1,显示并计算“A+B=60”; 如果输入2,显示并计算“A-B=20”; 如果输入3,显示并计算“A/B=2”; 如果输入4,显示并计算“A*B=800”; 如果输入其它选项,显示 “error”
#!/bin/bash A=40 B=20 echo "pleace input a number between 1 to 5" read X case $x in 1) echo "A+B=S((SA+SB))";; 2) echo "A-B=S((SA-SB))";; 3) echo "A/B= " expr $A / $B'";; 4) echo "A*B=S[ A*B ]";: 5) echo "SA+0 .2*SB"lbc:: 6) let "i=SA+SB";echo $i:; 7) ps;; esac
set (设置变量的值,一一对应)
设编写的程序名为testset,程序内容为: echo $1 $2 $3 set X Y Z echo $1 $2 $3 #sh testset 10 20 30 显示结果为: 10 20 30 X Y Z
linux服务器
基本配置
LNMP
Nginx
mysql
PHP
service apache2 start
网络信息安全
Docker虚拟化环境
Apache
安装apache http://httpd.apache.org/
启动apache
手动启动:[root@localhost /]#/etc/rc.d/init.d/httpd start
Apache服务器的设置文件位于/etc/conf/目录下,传统的是使用三个配置文件httpd.conf、access.conf和srm.conf来配置Apache服务器的行为。 httpd.conf提供了最基本的服务器设置,如守护程序httpd运行的技术描述。 在httpd.conf文件中有一系列标记命令。
systemctl start httpd.service #启动Apache服务
systemctl enable httpd.service #设置开机启动Apache服务
systemctl enable httpd.service #检查Apache服务状态