文章目录
Linux学习第一天:
一 linux简介
1.linux历史:
1969 ---- unix 1991—Linux 林纳斯·本纳第克特·托瓦兹
GNU-----组织 (GNU IS NOT UNIX)-----软件(GCC MAKE)
红旗linux —中国(生态链太弱了)
SUSE ------- 德国 (界面漂亮)
open suse 操作系统
redhat—红帽----企业版本(做服务器使用)稳定度高
—fadroa(个人使用,免费)
debian—(组织:最遵循于标准协议的系统)
----CentOS (服务器,付费)
----centos(个人版本停止更新)
----ubuntu (个人)
ucos: 特殊的linux系统,没有mmu模块,没有内存处理模块(系统代码量小,适合嵌入式系统)
重点: 在linux中一切皆文件。
2.linux特点:
免费;开源;稳定;速度快;多用户多任务;安全;软件库多;
二.linux体系结构
1 用户空间
分为:命令、程序、脚本
分为: shell
2. 内核空间(不允许用户直接操作)
系统调用
内核模块
3.vm的使用
开机:点击绿色箭头,
关机:点击两个竖线挂起或者点击黄色正方形关机,不允许点击右上角x
虚拟机:模拟一台机器,方便使用。占用硬件资源。
硬件设置: xxxx
ctrl + alt +移动鼠标
如果屏幕被锁住了,ctrl + q 解锁
三.shell命令
1.shell(贝壳):他是linux的内核保护工具,用来做用户和内核之间的交互的(翻译工具)
2.终端:字符设备,是一个模拟器,用来编写命令
3.关机命令:shutdown -t now (重点)
命令组成: 指令 选项 参数
注意: 指令是必备,选项和参数可有可无,并且可以以后多少个选项 也可以有多个参数。
提示符:student@student-machine: ~ $
用户名 主机名 当前目录 提示符(普通用户$,root用户提示符是#)
补充1:root为超级用户,相当于windows下的管理员
补充2:一行有多个命令,用分号隔开,如果命令一行写不完需要续航,用斜杠换行符。
补充3:当输入一个或多个字母后,按tab键会自动补齐剩下部分。
补充4:如果想查看历史命令,用键盘上下键或者history命令。
四、linux文件系统
linux的文件系统:文件在存储设备的组织方式。
1.EXT系统: ubuntu中普遍使用的EXT4(1T)
2.NTFS系统: windows目前的文件系统(2T)
3.VFAT系统: windows下的文件系统,fat32:(U盘)最大支持4G文件。
4.iso9660文件系统:光盘文件系统,包括*.iso文件。(PE安装)
5.NFS系统:linux的网络文件系统(windows中的共享目录)
五、vim的使用
vim:是一个编辑器,相当于windows的记事本。全程用命令
在编写c语言-系统编程-c+±-系统移植–驱动编程 都要使用
1.安装vim :sudo apt-get install vim
2.进入vim: vi+ 文件名 (如果文件存在则打开,不存在则创建)
3.三种模式:
命令模式:刚进入vim是命令行模式。
插入模式: 输入i ,o ,a进入到编辑模式,按下ESC进入命令模式
底行命令:由命令模式输入冒号进入底行命令模式
4.进入插入模式:
i : 在光标前输入内容
I: 在当前行行首输入
o:当前行重启下一行输入
O:当前行重启上一行输入
a:当前光标的后一个位置插入
A:在当前行末尾插入
5.命令模式下的命令
dd------- 删除当前行
u---------撤销最后一次操作
ctrl+r---- 重做,也是回复撤销的动作
end------光标移动到当前行末尾
home----光标移动到当前行行首
yy--------复制一行,复制两行 2yy
p---------粘贴一次,如果需要粘贴两次则2p
gg--------到文件行首第一个字母
G---------到当前文件最后一行行首
x -------- 删除光标所在的字符
dw------- 删除一个单词
y$--------复制当前光标当当前行末尾的内容
6.底行命令模式
/关键词—在文件中查找关键字。部分匹配。n是往下查找,/good 则在文件中查找有good字眼的文字。gooda也是匹配的。
/<关键字> 在文件中查找关键字,完全匹配。 /<good> 其中gooda不匹配,只有good才匹配。
:wq------保存文件退出
:q!----- 强制退出
:q -------直接退出
:w ------保存 (相当于ctrl + s
:x ------ 保存退出
:set number (:set nu) 给vim设置行号
: set nonumber 给vim取消行号
: vsplit --- 设置垂直分屏
: split --- 设置水平分屏
:set ai sw=8 设置缩进为8空格
Ctrl+shift+T 打开终端
Ctrl+shift+N 新建终端
7.补充:vim非正常退出,会产生swp文件,会影响到c程序的编译,直接通过rm .xxx.swp 删除临时文件。
五、linux文件类型
0 前奏:ls -l 或者 ll
打印当前目录下文件的详细信息
格式: drwxrwxr-x 3 student student 4096 7月 2 23:05 day01
1.文件类型 (第一个字母)
普通文件: -开头,表示普通的二进制文件,可执行文件,字符文件
目录文件: d开头,相当于windows下的文件夹
链接文件:l开头,相当于windows下的快捷方式
软连接:xxx
硬链接:xxx
2.设备文件:用来表示某一个设备,设备文件放在/dev
c开头,表示字符设备文件
b开头,块设备,比如说硬盘sda
s开头,套接字设备(网卡) socket
p开头,管道设备。
3.字符设备:console—终端设备
null--------空设备
mouse1---鼠标
event4----键盘设备
tty0~20--串口设备
4.补充:
ROM:只读内存,只能读出事先存储的内容的存储器,断电不丢失(可以安装多少程序)
RAM:运行内存,可读可写,断电会丢失内容(手机同时运行多少程序)
六、文件访问权限
1.格式: d rwxrwxr-x 3 student student 4096 7月 2 23:05 day01
2.权限: rwx rwx r-x 分成3组,第一组是创建者权限(u),第二组是 组员权限(g) 第三组是 其他人权限(o)
3.解释: r 是可读权限(read) w是可写权限(write) x是可执行权限(excute) -表示没有此权限
—rw-r-x : 创建者不可读不可写不可以执行,同组只有读写权限,其他人读和执行权限
4.表示: 字符表示:rwx r-x r–
绝对表示:111 101 100 用8进制表示:754
文件创建默认权限 rw-rw-r-- 是110 110 100 则是664
目录创建默认权限 rwxrwxr-x 是111 111 101 则是775
5.第十一个字母
如果当前详细信息是目录(day01),则3表示有3个子目录
如果当前详细信息是文件(danny.c) 则1表示有几个链接。
6.ls-l格式中剩下部分
第一个student:创建者
第二个student:当前文件放在哪个组中
第三个4096: 表示文件大小
第四个7月xx: 表示最后的修改时间
第五个day01: 表示文件名
7.补充:在windows下复制 ctrl +c 在linux下复制 ctrl+shift +c
在windows下粘贴:ctrl+v 在linux下粘贴 ctrl+shift+v
在windows下锁屏 win+L 保存 ctrl+s 撤销 ctrl+z 全选 ctrl+a ; 查找 ctrl+f ; 剪切 ctrl+x
七、linux系统目录结构
1.linux的目录结构是树状结构(只有一个根目录 /),在windows是森林结构,有多个盘符
2.根目录/下有很多一级子目录
1> /bin 用来存放命令文件 如ls cd等
2> /etc 用来存放系统配置文件 xx.conf (passwd文件)
3> /dev 用来存放设备文件 比如说块设备 字符设备 鼠标 串口.....
4> /media 用来存放媒体 cdrom
5> /home 用户的家目录,在家目录中为每个用户创建一个子文件夹,例如student 用户 有/home/student目录
6> /root 是root用户的家目录
7> /lib 用来存放库文件。
动态库:在windows下是dll文件,在linux下是.so文件
静态库:在windows下是lib文件,在linux下是.a文件
8> /proc 和/sys 特殊文件系统(虚拟文件系统)
9> /tmp 临时目录,存放临时数据
10> /usr 用户的应用程序的安装目录
11> /mnt 用来外部文件系统(例如挂载u盘)
Linux学习第二天:
一、路径表示
点(.):当前路径,表示所在的位置,每个目录中都有点目录
点点(…):表示上一层目录,比如现在目录是/home/student/day01中,…表示student目录
波浪线( ~ ): 表示每个用户的主目录,如果是student用户, ~ 的路径是/home/student/ 如果是danny用户,~表示/home/danny/
根目录(/):这个linux系统的根目录,相当于windows的c盘。
绝对路径:从根目录开始的路径,不管当前目录在什么位置,使用绝对路径都可以找到指定的位置,指定位置不会变。表示 /home/student
相对路径:相对于某个目录而言的路径,比如说我在楼下,如果我当前的位置在10楼,我的楼下是9楼,
如果我在2楼,我的楼下是1楼,所以相对路径是会随着你当前路径而改变的。在平常开发过程中,尽量使用相对路径。表示 …/danny/
二、linux的常用命令
1.cd 跳转目录 (重)
格式1: cd 目录名 表示跳转到指定目录
格式2: cd 表示跳转到~目录
注意:如果目录名只是一个文件夹名称,默认会加上./
例如: cd day01 会自动转换成 cd ./day01
cd .. 跳转到上一层
2.pwd 查看当前所在路径 格式 pwd
3. mkdir 创建目录(重)
格式1: mkdir 目录名 ; 在当前目录创建目录
格式2: mkdir -p 目录1/目录2 创建多级目录
格式3: mkdir -m 权限 目录
mkdir day01/danny ~ day01 在day01中创建danny目录
注意:如果目录名只是一个文件夹,会自动加./
练习: 在桌面创建day02目录,创建者权限只有可读,同组有可读和可执行权限,其他人只有可读权限。
4.rmdir 删除目录 (重)
格式: rmdir 目录名 删除空目录
格式: rmdir -p 目录1/目录2 多级别删除
注意:目标目录必须为空,否则没法删除
5.ls 查看指定目录的内容(重)
格式: ls 目录 打印指定目录下的内容
格式: ls -l ll 查看文件的详细信息
格式: ls -a 查看当前目录下的所有文件(包含隐藏文件)
格式: ls -d 列出当前目录,也就是目录本身
格式: ls -t 按照修改时间的先后顺序排序列出
格式: ls -r 按照文件名的逆序排序显示
格式: ls -R 按照递归的方式把子目录中的所有文件打印出来
补充: 通配符* 表示0~多个字符, 比如:abc中 abc;abcd;abc1;abcdefg;
通配符? 表示一个字符:比如abc?中 abcd abc1 但abcdef不符合
通配符 […] 表示在中括号中选一个指定的字符; ls a[df].conf ,表示 第一个字母是a 第二个字母是d或者f的conf文件
通配符[-]:表示在a到d范围之内的一个字符;例如: ls a[d-f].conf ,第一个字母是a,第二个是d到f中的任意一个,的conf文件
通配符[^…]: 表示不存在括号中的字符。ls ?[^abc].conf,表示:第一个字母任意,第二个字母不是abc的conf文件
三、系统管理命令
1.用户信息文件。 /etc/passwd 保存用户信息数据
student : x : 1000 : 1000: ,:/home/student: /bin/bash
用户名 密码 用户ID 组id 用户主目录 shell位置
可以自己设置用户id,系统用户的id从1到999,普通用户从1000+
root的用户id是0
2.adduser 创建新的用户
格式:adduser 用户名(重)
注意: 创建用户后,会在home目录下用户目录,在passwd中记录用户信息,如果权限不够,在前面加上sudo,密码是8
参数: --home:设置用户主目录 -uid 设置用户id -gid 设置组id
例如: adduser --home /home/danny666 -uid 8888 -gid 8888 danny688
3.passwd 修改用户密码
格式: passwd 用户名 (重)
注意:修改密码不可以和原密码相同,密码长度不可以低于6位,不可以太简单。
4. su 切换用户(重)
格式: su 用户名
注意: 需要输入密码,如果权限不够需要加sudo
5.userdel 删除用户
格式: userdel 用户名 ;其中-r是删除主目录
四、文件处理命令
1.查看帮助文档
第一种方式:man + 命令 还可以查询函数使用方法:man +(第几卷) + 函数
第二种方式: 命令 --help
第三种方式: whereis + 命令 查看命令的帮助文档位置
2. echo 在屏幕上输出
格式: echo 字符串 直接在屏幕上打印
管道:echo “danny shuai”| cat >hello.c
3. cat 在屏幕上打印信息(重)
格式: cat 文件名 打印文件信息,不可以在cat后加单独的目录
格式: cat 文件1 > 文件2 覆盖重定向。 把文件1中的内容拷贝到文件2中。
格式: cat 文件1 >> 文件2 追加重定向。把文件1中的内容追加到文件2的末尾。
格式: cat > 文件1 输入覆盖重定向。把键盘输入的内容覆盖到文件1中。 结束用ctrl+c
格式: cat >> 文件1 输入追加重定向。把键盘输入 的内容追加到文件1 的末尾。
补充:-v表示特殊符号。 cat -vE danny.c
五、文件操作命令
1. touch创建文件(重)
格式: touch 文件名
注意:如果文件不存在 则创建文件 如果文件存在 则更新最后的修改时间
2. mv 移动 或者重命名(重)
格式1: mv 文件1 文件2 把第一个文件复制到第二个文件中,然后删除第一个文件
格式2: mv 目录1 目录2 如果目录2存在,把目录1移动到目录2中
格式3: mv 文件1 目录1 把文件1移动到目录1中,如果目录2不存在,则把目录1的名字修改成目录2.
选项: -i 询问模式,提示是否覆盖 -v 提示移动的步骤 -b 备份覆盖文件
练习: 先创建两个文件 danny1 和danny2 在第一个文件中输入1234,在第二个文件中输入abcd 然后把第一个文件中内容追加到第二个文件中。
3 rm 删除文件(重)
格式: rm 文件 ; 删除文件
格式: rm -rf 目录名; 删除指定目录,可以多级删除。
选项: -r 删除目录 -f 强制删除 -i 提示是否删除
练习: 把当前目录下所有以a开头,第二个字母不是abc的.c文件删除 rm a[^abc]*.c
4.cmp 比较两个文件是否相同(重)
格式: cmp 文件1 文件2
如果文件1和文件2相同则无任何打印,如果文件1和文件2不相同则打印第一处不相同的字符位置。
5.cp 文件拷贝(重)
格式: cp 文件1 文件2 ; 如果文件2不存在则新建后复制,如果文件2存在则覆盖粘贴。
格式: cp 文件1 目录1; 把etc目录下的 第三个字母不是abc的conf文件拷贝到主目录的day01中
格式: cp -r 目录1 目录2; 递归复制目录
参数: -i 询问 -f强制 -r 递归复制
6.cut 按照某一个要求查看文档(重)
格式: cut -d ‘分隔符’ -f 目标列 文件名
例子: 把passwd文件中所有的用户名打印出来。
练习: 把所有用户的主目录名称存入danny1的后面。
7.more:分屏查看文件(较大文件查看)(重)
格式: more 目标文件
格式: more +n 目标文件 ;从第n行开始查看
格式: more -n 目标文件 ; 每一页是n行显示
注意:用空格翻页,或者使用ctrl+f ctrl+b .用回车键查看下一行
8.less 分屏查看文件
格式: less 目标文件
参数: -p 查找关键字,从第一个找到的位置打印
-M 查看百分比 ,例如less -M ./danny
练习: 查找passwd文件中是否有student关键字
9.head 查看文件头部内容
格式: head 文件名 ;默认显示文件的前10行
格式 head -n 5 文件名 ; 显示文件的前5行
格式: head -n -5 文件名; 除最后5行外其他全部显示
格式: head -c 5 文件名; 除最后5个字符外其他都显示
10.tail 查看文件尾
格式: tail 目标文件 ;默认显示后10行内容
格式: tail -n 5 目标文件; 显示最后5行
11.file
格式: file 目标文件
作用:查看文件类型 (目录文件,设备文件。普通文件)
student@student-machine:~$ file /dev/tty0
/dev/tty0: character special (4/0)
12.alias 给命令取别名
格式: alias 别名='命令'
注意:别名就表示命令,下次直接使用别名就行。
取消: unalias 别名; 取消别名
13.chmod 修改文件权限 (重)
格式: chmod 绝对值权限 文件名
chmod 665 danny1
格式: chmod u+x danny1 对拥有者加上可执行权限
chmod a+x danny1 所有人加上可执行权限
chmod o-x,a+r danny1;其他用户取消可执行权限,所有用户加上读权限。
chmod o-x,a+r danny1 danny2 两个文件同时修改
例子: 请创建一个文件danny1,把拥有者的写权限去掉,组加上可执行权限 chmod u-w,g+x danny1
u:表示拥有者 g:表示同组 o:表示其他 a:表示所有
14.chown 修改文件属组和属主 (重)
格式: chown 新的属主 文件名 ;修改文件的属主
格式: chown 新的属主:新的属组 目标文件 ; 修改文件的属主和属组
格式: chown 新的属组: 目标文件; 修改属主,同时把属组修改成当前属主的默认属组。
案例:在student用户下:文件属性如下
-r-xrwxr-x 1 danny student 19 7月 5 16:43 danny1
student权限 rwx
如果切换到abc用户后,请问当前用户对danny1的权限是r-x
Linux学习第三天:
1.权限掩码
满权限,一个文件的满权限是666,创建文件默认是664。 一个文件夹(目录)的满权限是777,创建文件默认权限是775
公式: 创建文件默认权限 = 满权限 - 权限掩码
格式: umask 权限掩码
练习: 把权限掩码修改成022后,创建文件和目录的权限是多少,umask 022,创建文件的默认权限变成644,创建目录的权限变成755
2. find查找文件 (重)
格式: find 目标目录(哪里查) 查找规律(怎么查)
格式: find -name 关键字
练习: 请查找整个linux系统中 的所有passwd文件。 sudo find / -name passwd
格式:find -size 大小 ;用c,k,M,G,T单位使用
注意: 如果需要多个条件连接,-and 并且关系。 -or 或者关系
练习: 请查找出 linux系统中,所有大于100k并且小于10m的文件 find -size +100c -and -size -10M
格式: find -user 属主; 按照属主查找文件 ; sudo find ~ -user danny
格式: find -atime 时间; 在多少天内访问过的文件
格式:find -mtime 时间; 多少天内修改 ???
3.tar 打包和解包(不做压缩)(重)
格式:tar -cvf 目标包(*.tar) 源文件/目录 ; 给文件打包
格式:tar -tvf 目标包 ; 查看包中的内容
格式:tar -xvf 目标包 -C 目标地址; 解包到指定位置
格式:tar -Avf 包1 包2; 把包2中的内容追加到包1中
格式:tar -rvf 目标包 源文件 ; 追加 ,把danny文件追加到刚才的danny.tar
4.解压缩 工具
格式:tar -zcvf 目标包( *.tar.gz) 源文件 ;压缩文件 ,gzip压缩
格式: tar -zxvf 目标包( *.tar.gz) -C 位置 ;解压缩
格式:tar -jcvf 目标包( *.tar.gz) 源文件 ;压缩文件 bzip2压缩
格式:tar -jxvf 目标包( *.tar.gz) ;解压缩文件 bzip2压缩
5.shutdown 关机命令 (重)
格式:shutdown -t 时间 ;在多少分钟后关机
格式:shutdown -r 时间; 重启
格式:shutdown -f 强制关机
格式: shutdown -c 取消关机;
6.clear 清空屏幕
7.who 当前用户是谁
显示名称 登录时间 使用的串口 全部显示
8.whoami 只显示用户名称
9. date 时间日期(重)
作用:用命令显示和设置系统时间
格式: date ; 显示当前的日期 时间
格式: date '+%c' ;显示时间和日期,但时间用中文表示
格式: date ‘+%x’ ; 只中文显示年月日
格式: date ‘+%X’ ;中文显示时间
格式: date ‘+%T’;只显示时间,用冒号24小时格式显示
格式: date ‘+%D’; 用斜杠的格式表示日期
10.info 网页的形式查看帮助信息
格式: info + 命令 (man 命令;命令 --help)
11.ps 查看进程(process)
格式: ps -aux ; 查看所有进程
ps -au ; 打印进程
信息: USER ----进程拥有者
PID-------进程id
CPU-------cpu使用率
MEM------内存使用率
VSZ -------虚拟内存
STAT-------进程状态 (R 表示在运行,T表示暂停 S堵塞)
START------进程开始时间
TIME-------执行时间
COMMAND 用哪个命令执行的
12 kill 杀死进程(发送信号)
格式: kill -9 PID;
13 pstree
作用:讲所有进程以树状图形式显示,树状图会以pid或者init为基本进程的根来展现。
14 网络命令
1> ifconfig 打印网卡的信息 (linux下)
ipconfig 在windows打印网卡信息
2>.Link encap:本地环回 --表示自己的ip地址,用127.0.0.1表示
3> 硬件地址:也叫mac地址:网卡地址,例如 00:0c:29:94:12:b1 共48位,前24位和后24位,前24位给厂商。后24位给个人。mac是全世界唯一。
4>逻辑地址:ip地址,点分十进制:例如 192.168.5.4,ip地址的每个10进制最大是255.
5> 网关:不同局域网之间通信的中间设备。例如:192.168.5.1 最后一位是1.这个ip地址就是网关地址。
下午
一.网络命令(重)
6>子网掩码:用来区分网络地址和主机地址部分,基于子网掩码,网络管理员可以 将网络划分为若干个子网
每个ip地址分为主机地址部分 网络地址部分。子网掩码中,1对应ip地址中的网络地址部分,0表示主机地址部分。
案例:子网掩码为255.255.255.0而ip地址为192.168.125.10;
ip转换成2进制: 11000000 .10101000.11111101.00001010
子网掩码的2进制 11111111. 11111111.11111111.00000000
7>地址分类
A类地址:第一个字段是网络地址(最高位是0),剩下三个字段是主机地址,子网掩码255.0.0.0
B 类地址:网络地址和主机地址分别2字段(最高两位是10)子网掩码:255.255.0.0
C 类地址:三个字段的网络地址,1个字段主机地址,最高三位是110. 255.255.255.0 (192.168.5.1)
D 类地址:可以用来做组播地址
E 类地址:用来做测试,实际生活中不使用
8>动态地址DHCP
ip地址分为ipv4和ipv6;因为ipv4不够用,所以开发出ipv6地址。
ipv4只有32位。ipv6地址128
DHCP:动态主机配置协议,实现动态分配ip地址资源。
9> DNS: 域名解析协议,把域名(网址)解析成ip地址或者反解析。
二、shell脚本
1、shell:贝壳,是用户空间和内核空间交互的中间件,shell脚本是shell命令的集合,它是解释型语言。c是编译型语言。
2.为什么学shell
1>服务器管理或者系统配置
2> 新的系统安装后,需要软件的配置和安装
3>为了提高效率,是维护更方便快捷。
3.shell脚本的编程步骤(解释执行)
1>使用vim编写shell脚本,shell脚本时*.sh后缀
2>修改脚本的执行权限; chmod 777 *.sh 或者 chmod a+x *.sh
3> 执行 ./脚本名。 例子:./goog.sh
4.定义变量(可以修改的量)
1>定义变量:在shell中变量定义不需要类型 name=123
使用变量:$变量名 或者 ${变量名}
打印内容: echo
2>输入 read
格式: read 变量名,如果没有输入则会一直堵塞(等待)
注意:已经定义好的变量可以重新定义,并且可以使用变量赋值
3>unset 变量名 取消变量的定义,取消定义后变量不可以重新使用,除非重新定义。
4>readonly 不允许变量修改
格式: readonly 变量=值
注意:readonly变量不可以unset
练习: 请定义三个变量,年龄,性别,姓名 用echo打印
5>变量命名规则
命名中只可以是字母下划线数字,不可以是其他特殊符号
变量名中间不可以用空格 ac dd 是两个变量
不能使用标点符号
不能使用shell中的关键字
不可以数字开头,只可以是下划线和字母开头
6>字符串:一串字符连接起来
两种表示方式:用单引号 ‘adsfad${name}’ 双引号“adasd${name}”
注意:如果是单引号,会照常输出,变量也会当做字符串内容
如果是双引号,会把变量替换,打印变量的值。
字符串拼接: name='danny'${age}' good'
字符串的长度:echo ${#string} 例如 name='danny' echo ${#name}结果是5
截取字符串: echo ${string:2:5} ;其中2表示从第三个字符开始,5表示总共打印5个字符
内容注释:可以用#做单行注释。(注释对电脑来说就是空白,给人看的)
7> 预定义变量
定义:预先在shell脚本中定义好的,具有特殊意义,可以直接使用的变量。
$0: 表示当前sh的文件名和路径
$1: 第一个参数的内容 比如在终端执行shell的时候 ./good.sh abc def 则$1表示abc
$@:表示所有的参数内容
$# :表示参数的个数
$* :表示所有参数
$? :表示上一个指令是否成功 如果成功则为0 如果失败 为非0
$$ : 当前进程的id
8>系统环境变量(域名)
9> 数组
10>功能性
1> 输入语句
read:从键盘输入的内存存入到 变量中
多个读取: read 变量1 变量2 变量3
练习:请从键盘输入3个值,连接到一起后打印出来。
read name age sex
echo $name$age$sex
2>expr 算数语句
expr:用来做加减乘除的整数运算。
使用: expr 变量 运算符 变量
使用: `expr $a + $b`
`expr $a \* $b` 表示乘法
`expr $a / $b`
`expr $a % $b`
注意: 乘号运算符需要用\* ,(转义字符)
反单引号在esc下面
Linux学习第四天:
一、shell脚本系统环境变量
系统环境变量:和系统相关的并且已经预定义好的变量。
PATH: 环境变量中的路径信息。文件或者命令在当前路径下找不到则从PATH路径中查找。
USER:当前的用户名
UID:当前用户的id
HOME:当前用户的主目录位置
PWD:当前所在的位置
TERM:终端的类型 xterm
备注: 多行注释表示可以对跨行的代码一次性的注释。格式如下
:<<!
sadgasd
!
二、测试语句
1.中括号用来实现逻辑运算,是计算测试语句的运算符 [ ]
2.关系运算符
-eq : 比较左右两个值是否相等
-ne:比较两个值不相等则为真
-gt :比较左值是否大于右值,如果大于则结果为真
-ge :比较左值大于或者等于右值,满足则为真
-lt : 比较左值是否小于右值,如果小于则结果为真
-le :比较左值是否小于等于右值,如果满足则结果为真
-o :表示或者的关系,表达式左侧和右侧有一个为真结果为真
-a: 表示并且的关系,表达式左侧和右侧都为真结果为真
#输入三个值: 判断哪个值最大,打印出来。
案例:
echo "请输入三个值"
read num1 num2 num3
if [ $num1 -ge $num2 -a $num1 -ge $num3 ]
then
echo "最大值${num1}"
fi
if [ $num2 -ge $num1 -a $num2 -ge $num3 ]
then
echo "最大值${num2}"
fi
if [ $num3 -ge $num1 -a $num3 -ge $num2 ]
then
echo "最大值${num3}"
fi
3.文件运算符
-b 文件名:判断文件是否为块设备文件
-x 文件名:判断文件是否有执行权限,不管是哪个用户,只要有就行
-r 文件名:判断文件是否有读权限,不管是哪个用户,只要有就行
-w 文件名:判断文件是否有写权限,不管是哪个用户,只要有就行
-e 文件名: 判断文件是否存在
-f 文件名:判断文件是否为普通文件
-p 文件名:判断文件是否为管道文件
-s 文件名: 判断文件是否存在,并且不为空
文件名1 -ot 文件名2: 判断文件1是否比文件2更旧
文件名1 -nt 文件名2:判断文件1是否比文件2 更新
案例:
echo "请输入文件名"
read myfile
if test -x $myfile
then
echo "danny有可执行权限"
fi
if test './danny' -nt $myfile
then
echo "danny是否比${myfile}新"
fi
if test './danny' -ot $myfile
then
echo "danny更旧"
fi
4.test语句:用来替换中括号,可以做逻辑运算
格式: test 测试条件
等价: [ 测试条件 ]
案例: if test $a -gt $b
练习:判断文件是否存在,如果存在则判断是否为目录,如果是目录则跳 转到目录中后创建danny文件。
三、分支语句和循环语句
if分支语句
1. if是分支语句,使用格式如下
if [ 测试语句 ]
then
语句
fi
2.c语言中的if语句格式
if(条件)
{
语句;
}
3.格式2:如果满足条件执行if,如果不满足判断第二个条件elif,如果都不满足执行else
if 测试语句1
then
语句2
elif 测试语句3
then
语句4
else
语句5
fi
执行:首先判断测试语句1是否满足,如果满足执行语句2后结束if,如果if测试语句为假,则继续判断测试语句3,
如果测试语句3为真,执行语句4后结束if语句,如果条件都不满足则执行else中的语句5;elif可以有多个。
练习:学生成绩的等级打印,如果输入的成绩是100到90之间则打印A等,如果是80到89则打印b等,
如果是70到79打印c等,剩下所有的都是d等,输入成绩只可以是0到100之间。
echo "请输入成绩"
read score
if test $score -ge 90 -a $score -le 100
then
echo "你的成绩${score} 是A等"
elif test $score -ge 80 #如果第一个条件不满足则成绩一定小于90
then
echo "你的成绩${score} 是B等"
elif test $score -ge 70
then
echo "你的成绩${score} 是C等"
else
echo "你的成绩${score} 是D等"
fi
4.if的嵌套:在if中还有if else
格式:
if 测试语句1
then
if 测试语句2
then
语句3
else
语句4
fi
elif 测试语句5
then
语句6
else
语句7;
fi
执行: 先判断测试语句1是否满足,如果满足则继续判断测试语句2,如果测试语句2满足则执行语句3后退出外部if,如果测试语句2不满足,
练习: 输入一个年份,判断是否为闰年(年份可以被4整除,不可以被100整除的年份,或者可以被400整除)
num1=`expr $year % 4`
num2=`expr $year % 100`
num3=`expr $year % 400`
if [ $num3 -eq 0 ] #可以被400整除
then
echo "${year}是闰年"
else
if [ $num1 -eq 0 ]
then
if [ $num2 -ne 0 ]
then
echo "${year}是闰年"
else
echo "${year}不是闰年"
fi
else
echo "${year}不是闰年"
fi
fi
5.while循环语句
1>循环语句:不断的执行某一些代码。
2>格式: while 测试语句
do
循环体
done
3>c语言中:
while(判断语句)
{
循环体
}
4>执行:先判断测试语句是否为真,如果为真则执行循环体代码,然后继续判断测试语句是否为真一直执行循环体,直到测试语句为假则结束
练习:请用while循环计算1到100的和
#! /bin/bash
num=0
sum=0
while [ $num -lt 100 ]
do
num=`expr $num + 1`
sum=`expr $sum + $num`
done
echo "$sum"
5.until循环
格式: until 测试语句
do
循环体
done
特点: 条件不满足则执行循环体,条件满足则退出循环。
练习:请用until循环,计算1到100的奇数和。
6.for循环
格式: for 变量 in 列表
do
循环体
done
执行:每次从值列表中取出一个值存入到变量中,进入循环体执行代码,知道所有列表中的值被取出。
退出循环:break和continue。
练习: 请用for循环打印出所有的参数。例如 ./abc.sh 1 2 a d dsd
temp=1
for num in $*
do
echo "第${temp}个参数是${num}"
temp=`expr $temp + 1`
done
练习: 请打印当前目录下的文件和目录,如果是文件 在最后面加[文件],如果是目录则在目录 最后面加上[目录]
#!/bin/bash
for num in `ls ~` #只可以在当前目录
do
if [ -f $num ]
then
echo "${num}[文件]"
elif [ -d $num ]
then
echo "${num}[目录]"
else
echo "${num}[什么都不是]"
fi
done
7.函数
函数:一块代码的封装,方便使用,减少代码量,使代码模块化。
格式: function 函数名()
{
函数体;
}
调用: 函数名; 直接使用函数名的方式调用函数。
注意:function可以省略。
8.数组
定义: 多个数据的集合,使用方便,一个名字加下标就表示一个变量
格式:数组名=(值1 值2)
使用:
数组名
[
下标
]
例如
a
r
r
=
(
1
2
′
a
′
)
e
c
h
o
"
{数组名[下标]} 例如 arr=(1 2 'a') echo "
数组名[下标]例如arr=(12′a′)echo"{ar[0]}"
赋值:数组名[下标]=值 ;可以修改数组中的值。
注意:下标从0开始,arr[0]表示第一个元素。在数组中可以有多中数据类型。
练习
1 #! /bin/bash
2
3 myarr=(1 2 'a' "sdg") #定义一个数组
4 echo "${myarr[4]}"
5 myarr[4]=danny #给元素赋值
6
7 echo "${myarr[4]}"
8 #打印所有元素
9 for temp in ${myarr[@]}
10 do
11 echo $temp
12 done
13 echo "${#myarr[4]}" #获取单个元素的长度
14 echo "${myarr[@]}" #表示所有的参数
Linux学习第五天:
1.磁盘命令
磁盘命令:处理硬盘的命令(暂时这么理解)
1> df 查询磁盘的设备名
/dev/sda1 (文件系统) 39089600(块大小) 5591140(已使用大小) 31489784(可使用大小) 16%(使用比例) / 挂载点
2.tmpfs系统是内核直接维系的一个虚拟内存控件(临时文件系统)可以提供RAM一样块的读写速度。
3. du 列出指定路径中的 文件和目录的使用磁盘块数(每一块是512字节)
4. fdisk
作用: 查看磁盘的分区情况
格式: fdisk -l 磁盘名称
例如:
设备 启动 Start 末尾 扇区 Size Id 类型
/dev/sda1 * 2048 79693823 79691776 38G 83 Linux
/dev/sda2 79695870 83884031 4188162 2G 5 扩展
/dev/sda5 79695872 83884031 4188160 2G 82 Linux
5. mount:挂载u盘,移动硬盘,光盘
格式: mount 设备文件名 挂载点/mnt/u
挂载:在linux下是树状的文件结构,如果使用u盘, 需要挂到mnt下的某个子目录中,u盘文件和根目录相关联
步骤:
1> 插入u盘前先用fdisk-l 查看下现有的磁盘
2>插入u盘,继续使用fdisk -l查看增加的磁盘名称
3>在mnt目录下创建一个子目录,例如:sudo mkdir /mnt/usb
4>使用命令开始挂载:mount -t vfat /dev/sda6 /mnt/usb
5>挂载成功后可以直接访问/mnt/usb中的文件,也就是u盘中的文件
6. umount 目标设备 挂载目录
(插上优盘,把u盘挂载到mnt目录中)–9龚伟-作业
找到mnt中的目录,可以查看到u盘中的文件,说明挂载成功。
二、网络命令
1>ifconfig 查看网卡的设备信息
格式:ifconfig 网卡设备名 ip地址; 临时设置。
案例:sudo ifconfig eth0 192.168.1.123 ;设置ip地址
案例:sudo ifconfig eth0 netmask 255.255.0.0 ;子网掩码
案例: sudo ifconfig eth0 broadcast 192.168.1.200 ;设置广播地址
格式: sudo ifconfig 网卡设备名 down ;断网
格式: sudo ifconfig 网卡设备名 up ;联网
ipconfig 在windows下查看设备的网卡信息 (MAC)
本地环回:127.0.0.1 01111111
2>ping 测试一下网络是否联通
格式:ping + ip地址 查看和某一个ip地址是否联通
格式:ping + 域名 查看某个域名是否联通,一直打印,用ctrl+c结束
格式: ping -c 5 域名 ; 打印5次后结束
3> telnet 远程登录(TCP协议)
格式:telnet 目标ip 端口号
(http--80 mysql---4416 QQ--8080 oracle---8000)
4> ssh 安全远程登录(对用户信息加密)
格式: ssh 目标ip地址 端口号
5> netstat 查看网络的状态信息
格式:netstat 参数
参数: -r 显示路由表。
-i 显示网络的接口列表 lo ,eth0。
-g 显示IPV4和IPV6的成员
-s 每个协议的数据统计
-a (自学)
三、.gcc编译器
1、gcc 把c语言程序编译成可执行程序的工具,g++正对于c++,gcj–java
2.编译工具:gcc
编辑工具: vim gedit
3.编译原理
1> 预处理
作用:把头文件等复制粘贴到指定文件,检测预处理语法是错误。
格式: gcc -E *.c(源文件) -o *.i(预处理文件)
2> 编译
作用:检查c语言的语法
把c语言的代码编译成汇编语言代码
进行简单的分区(代码运行放内存,先确定存放位置)
格式: gcc -S *.i(预处理文件) -o *.s(汇编文件)
3> 汇编
作用:将汇编语言转换成二进制的机器指令
名称的统一处理
继续分区处理
格式: gcc -c *.s(汇编文件) -o *.o(目标文件)
4> 链接
作用:把目标文件和其他的库文件关联(动态库*.so和静态库*.a)
格式: gcc *.o(目标文件) -o a.out(可执行程序)
注意:如果咩有-o则会生成默认的可执行程序a.out
选项: -g 做调试使用
-wall 显示警告信息
-l 添加库文件
四、make工具
1.安装:sudo apt-get install make
2.make: 主要是解决多文件联编的问题。
1> 如果用gcc来联编:容易少写文件,文件名写错。
2>make方便进行一次性的编写,方便团队编译。
3> “自动化编译”,一旦写好,只需要用make命令,整个项目编译,提高工作效率
3.使用make
1> 编写多个.c文件
2> 编写makefile文件(文件名不可以修改)
3> 在终端输入make ,直接会在当前目录中查找makefile文件
4> ./可执行程序 执行代码
4.makefile文件规则
目标:依赖关系
<tab>依赖列表:表示生产目标所需要的文件
abc : head.o main.o
gcc -o abc head.o main.o #说明head.o main.o产生abc
head.o : head.c
gcc -c head.c -o head.o
main.o :main.c
gcc -c main.c -o main.o
5.只会编译修改后的文件,没修改的文件不会编译。(10w+)
6.伪目标
伪目标:不在终极目标体系中,为了安装或者打包而建立的伪目标
伪目标名:
<tab>执行命令
调用:make 伪目标名
7.定义变量
定义变量格式:
变量名:=变量值 #覆盖的方式赋值
变量名 +=变量值 #级联的方式赋值
使用变量:${变量名} 或者 $(变量名)
8. 内置变量
makefile中已经定义好的变量,直接使用
$@: 目标
$^: 所有依赖列表,可以在伪目标中使用
$<:依赖列表中的第一个
$?:所有依赖列表,不可以在伪目标中使用
五、GDB
1. gdb:用来调试运行中的错误。或者查看运行中的数据信息。
2.安装 sudo apt-get install gdb
3查看版本: gdb -v
4.在使用gdb前,需要用gcc -g来编译,如果没有-g则没法使用gdb
5.使用: gdb 可执行程序名
6.查看源代码
1>list 文件名:行号 查看文件中行号对应的前后5行的代码
2>l 行号 l等价于list,只有一个文件时候不需要用文件名
7.断点:代码执行过程中,希望停止在某一行,则可以打断点。
1> break 行号
2> b 文件名:行号
3>查看断点方式 info break
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040054d in main at main.c:12
2 breakpoint keep y 0x0000000000400531 in find at head.c:13
4> 执行代码: r 或者 run
5> 执行下一行: n 或者 next
6> 进入函数执行:s或者 step
7> 打印变量值: print 变量
8>监控变量值:display 变量值
9> 结束单步执行: continue (执行到下一个断点停止)
10>退出gbd: q 或者quit
11> 删除断点: delete 断点号
总结:
博主就是在复习的过程中顺便总结下知识点,以便以后查看学习。
注:本博客仅供学习和参考,内容较多,难免会有错误,请大家多多包涵。到这里Linux的基本部分就结束啦,感谢观看。