复习
命令
ls 查看文件夹的文件列表
ls -a 显示全部文件
ls -l 显示详情
chmod 改变文件的权限 d - rw-rw-r–
chmod +x 文件名
chmod 664 文件名
man 查看文档 1 3 7
info 查看命令
help 查看命令 ls --help
cd 改变文件夹
绝对路径 从根开始的路径 /
相对路径 以当前位置为起点 . 当前位置 …上一级
pwd 查看当前路径的绝对路径
touch 创建文件或者改变文件的时间戳
mkdir 创建目录
mv 移动或者重命名
目标文件夹存在就是移动,不存在就是重命名
rm 删除文件 删除目录rm -r
cp 拷贝文件或者目录
cat 查看文件信息
more 查看文件信息
less 查看文件信息
head 查看文件的前几行
tail 查看文件的后几行
vim
三种模式
命令模式 yn dn p 88G ZZ
插入模式 A a I i O o
底行模式
作业
选择题
1.假设所有变量均为整型,则表达式(a=2,b=5,b++,a+b)的值是( B )
A)7 B)8 C)6 D)2
2.下列四组选项中,均不是C语言关键字的选项是 ( A )
预处理的指令不是关键字
A)define IF type B) getc char printf
C)include scanf case D) while go pow
3.下面四个选项中,均是C语言关键字的选项是 ( B )
A) auto enum include B) switch typedef continue
C) signed union scanf D) if struct type
4.C语言中的标识符只能由字母、数字和下划线三种字符组成,且第一个字符 ( C )
A)必须为字母 B)必须为下划线
C)必须为字母或下划线 D)可以是字母,数字和下划线中任一种字符
5.执行以下语句后a的值为( C )
int a,b,c;
a=b=c=1;
++a || ++b &&++c ;
&&的优先级高于||的优先级
A)错误 B)0 C)2 D)1
6.逻辑运算符两侧运算对象的数据类型( C )。
A)只能是0或1
B)只能是0或非0正数
C)只能是整型或字符型数据
D)可以是任何类型的数据
7.设x,y和z是int型变量,且x=3,y=4,z=5,则下面表达式中值为0的是 ( D )
A) ‘y’&&‘y’ B) x<=y
C) x||y+z&&y-z D) !(x<y)&&(!z||1)
8.已知x=43,ch=‘A’,y=0则表达式(x>=y&&ch<‘B’&&!y)的值是 ( C )
A)0 B)语法错 C)1 D)“假”
9.若希望当A的值为奇数时,表达式的值为"真",A的值为偶数?表达式的值为"假"。则以下不能满足要求的表达式是
( C )
!(A%2) 当A是偶数 A%2 0 1
A) A%21 B)!(A%20) C)!(A%2) D)A%2
10.判断char型变量c1是否为小写字母?正确表达式为( D )
A) ‘a’<=c1<=‘z’ B) (c1>=a)&&(c1<=z)
C) (‘a’>=c1)||(‘z’<=c1) D) (c1>=‘a’)&&(c1<=‘z’)
作业:
1 工作目录下创建目录shared及shared1
linux@ubuntu:~$ mkdir shared shared1
2 在shared1目录中创建9个子目录a1-a9
linux@ubuntu:~$ cd shared1
linux@ubuntu:~/shared1$ mkdir a1 a2 a3 a4 a5 a6 a7 a8 a9
3 在a5中创建3个文件file1-file3
linux@ubuntu:~/shared1$ touch a5/file1 a5/file2 a5/file3
4 在shared目录中创建两个目录old和new
linux@ubuntu:~/shared1$ cd …/shared
linux@ubuntu:~/shared$ mkdir old new
5 将shared目录更名为back
linux@ubuntu:~/shared$ cd …
linux@ubuntu:~$ mv shared back
6 拷贝/usr/include/stdio.h 到old内
linux@ubuntu:~$ cp /usr/include/stdio.h back/old
7 移动shared1目录到back目录内 删除a1-a4 a6-a9
linux@ubuntu:~$ mv shared1 back
linux@ubuntu:~$ rm -r back/shared1/a[^5]
8 将a5目录改名为front 并移动到new目录内
linux@ubuntu:~$ mv back/shared1/a5 back/new/front
1、进程管理
1)概念:
进程: 程序运行,系统会为程序预备一些资源(内存、cpu。。。),是我们程序运行所需要的一些资源,也可以 理解成程序运行的环境。
线程:线程是在进程中运行逻辑的单位。
进程中至少需要一个线程,任何线程都不可以脱离进程。
pid : 进程id (process id) 叫做进程号。 进程号由操作系统进行分配。用来识别唯一的进程。
ppid : 父进程id . (parent process id)
init进程: 此进程 的进程id 为 1. 这个进程不可以被 kill
父子进程: 创建出新进程的进程就是父进程。 被创建出来的,叫做子进程。
僵尸进程: 一个已经不再运行的进程。但是还没有消亡。还占用着系统资源。
正常情况下当父进程死掉的时候,会让子进程也死掉。当父进程死掉但是子进程没死,称之为孤儿进程。
孤儿进程: 是一个没有父进程的进程。 他会被 init 进程领养。
2)命令:
查看进程: ps aux ps -ef
查看进程树: pstree
杀掉进程: kill kill 2619 kill -9 2581 //必杀 kill -9 pid
ctrl + c 结束进程
ctrl + z 将进程暂停,并扔到后台。
fg 将进程调回前台。
练习:
编写一个程序,运行起来,找到该进程的进程id,并终止该进程。
#include <stdio.h>
int main()
{
while(1)
{
printf("还活着\n");
sleep(1);
}
return 0;
}
linux 3343 0.0 0.0 1988 280 pts/0 S+ 18:28 0:00 ./a.out
kill 3343 杀死这个进程
2、文件管理
1.查找文件
find
查找格式: find 路径 选项 选项值
示例: find /usr -name stdlib.h
find是搜索每个文件夹,慢。
which
查找可执行文件,一般用来查找命令 (相比较而言,查找速度快。因为which 只在指定的路径下查找,查找的是可执行文件)
which并不是在路径里搜索文件,它是去环境变量里找。
示例:which ls
locate
sudo updatedb
locate 与 find 不同: find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。
locate 的速度比 find 快,它并不是真的查找,而是查数据库,一般文件数据库在 /var/lib/slocate/slocate.db 中,
所以 locate 的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护,也可以手工升级数据库
练习:
使用不同的办法,找到 unistd.h 文件、 ps 可执行文件、 passwd 文件 所在位置。
locate unistd.h
which ps
locate passwd
2. 压缩文件
tar
压缩: tar cvfz dir.tar.gz dir
解压缩: tar xvfz dir.tar.gz
tar xzvf test809.tar.gz -C test 解压到指定路径下
c 创建压缩文件
x 解压缩
v 显示压缩过程
f 将多个文件打包生成一个文件
z 以gzip格式压缩
练习:
将工作目录下的 Desktop 目录压缩。 然后将压缩文件移动到 /tmp 下。 然后在此目录下,解压文件。
linux@ubuntu:~$ tar cvfz desktop.tar.gz Desktop
linux@ubuntu:~$ sudo tar xvfz desktop.tar.gz -C /tmp
3.链接文件
ln
建立硬链接: ln an.c an.bak // 根据物理编号inode 节点,建立连接
此时 an.c 和an.bak 是同一个文件的两个inode节点(文件节点)
建立软链接: ln -s an.c an.lnk // 根据路径 建立连接。 windows快捷方式一个概念
硬链接实验:
linux@ubuntu:~/22011$ ln test4.c test4.bak
linux@ubuntu:~/22011$ ls -l test4.c
-rw-rw-r-- 2 linux linux 111 Jan 18 17:35 test4.c
linux@ubuntu:~/22011$ rm test4.c
linux@ubuntu:~/22011$ vi test4.bak
linux@ubuntu:~/22011$ gcc test4.bak
test4.bak: file not recognized: File format not recognized
collect2: ld returned 1 exit status
linux@ubuntu:~/22011$ mv test4.bak test4.c
linux@ubuntu:~/22011$ gcc test4.c
软连接:
linux@ubuntu:~/22011$ ln -s test4.c test4.bak
linux@ubuntu:~/22011$ ls
a (3rd copy).c a (7th copy).c a.out t1.c t5.c t9.c test4.c
a (4th copy).c a (another copy).c b.c t2.c t6.c test2.c test.c
a (5th copy).c a.c c.c t3.c t7.c test3.c testdir
a (6th copy).c a (copy).c t10.c t4.c t8.c test4.bak
linux@ubuntu:~/22011$ ls -l test4.c
-rw-rw-r-- 1 linux linux 111 Jan 18 19:47 test4.c
linux@ubuntu:~/22011$ vi test4.bak
linux@ubuntu:~/22011$ rm test4.c
linux@ubuntu:~/22011$ ls
a (3rd copy).c a (7th copy).c a.out t1.c t5.c t9.c test.c
a (4th copy).c a (another copy).c b.c t2.c t6.c test2.c testdir
a (5th copy).c a.c c.c t3.c t7.c test3.c
a (6th copy).c a (copy).c t10.c t4.c t8.c test4.bak
linux@ubuntu:~/22011$ vi test4.bak
linux@ubuntu:~/22011$ cat test4.bak
cat: test4.bak: No such file or directory
总结:
硬链接文件,相当于一个实时备份文件。 同时,文件的链接数+1 。 如果想删除文件,需要删除所有的索引域。
索引域为0时,数据域才真正的被删除。如果文件多于1个索引。 而只删除了其中一个索引。文件的数据域并不会丢失。
软链接文件:相当于一个快捷方式。 它并不会增加文件的链接数。 是一个独立的快捷方式。 如果源文件被删除掉,
这个文件就真的被删除掉了。 此时软链接文件失效。 只要在原来的路径下,创建相同名字的文件,则软链接文件重新生效 。
4.管道符
|
作用: 前一个命令的输出,作为第二个命令的输入。
grep 在文本中查找关键字
cat test.c|grep for 查看test.c的内容,将查找到的内容作为grep的输入。
管道符的作用,将cat test.c的输出作为输入传给grep命令,grep命令会在输入中查找for关键字
练习:
查找根目录下是否存在 etc 这个文件。
linux@ubuntu:~/22011$ ls /|grep etc
练习:
查找 /etc 下是否存在 passwd 这个文件。
linux@ubuntu:~/22011$ ls /etc|grep passwd
练习:
查找 所有进程中是否存在 bash 这个进程。
linux@ubuntu:~/22011$ ps aux|grep bash
练习:
查找 /etc/passwd 文件中,是否存在 deamon 这个用户。
linux@ubuntu:~/22011$ cat /etc/passwd|grep deamon
5. 重定向符号 :
>
> 重定向 会覆盖原来的内容
>> 追加重定向 会在原有内容的后面追加新内容
示例: ls / > file.txt
3、网络管理
1.查看网络配置信息
ifconfig
eth0 : 第一块物理网卡
Ethernet :以太网
HWaddr 00:0c:29:82:8f:99 物理地址
inet addr:192.168.30.234 ipv4 地址
Bcast:192.168.30.255 广播地址
Mask:255.255.255.0 子网掩码
inet6 addr: fe80::20c:29ff:fe82:8f99/64 ipv6 地址
Local Loopback 本地环回
inet addr:127.0.0.1 本地环回地址
2.修改ip 命令:
sudo ifconfig eth0 192.168.40.199
ip地址就是我们的计算机在网络上的身份标识。
3.ping 测试连通性
ping 192.168.40.101
这个命令的目的是测试网络是否通畅。
4.安装包问题
a) ubuntu software center ubuntu 软件应用中心
b) sudo dpkg -i *.deb 本地安装
c) sudo apt-get install sl 网络安装
4、Gcc编译器
gcc(是一个编译器, 是GNU组织主要的编译工具)
gcc 是一个跨平台(跨软件平台 和 硬件平台)的编译器
跨平台,代码可以通过不同的编译器编译到适合不同平台运行的程序。
1.编译命令
gcc 编译在不指定生成的可执行文件的名字时,默认的名字是 a.out
-o 指定生成文件的名称
gcc hello.c -o hello
2.gcc 编译步骤
经过了四步 1 预处理 2 编译 3 汇编 4 链接
(1) 预处理
如果只做预处理 gcc -E -o hello.i hello.c
1) 如果有头文件包含,就将头文件内容 copy 到预处理文件中
预处理文件通常 .i
2) 如果程序中有注释,会去掉注释
3) 如果程序中有宏定义,用宏值替换宏名
(2) 编译(将c 文件变成汇编文件)
如果只做编译 gcc -S -o hello.s hello.c
hello.s 是汇编语言源文件
汇编语言:是最低层的编程语言,不容易理解
(3) 汇编(将c 文件变成机器码文件(二进制文件))
如果只做汇编 gcc -c hello.c, 会自动生成hello.o (机器码文件, 二进制文件)
hello.o (机器码文件, 二进制文件)
机器码文件 是 计算机硬件可以识别的代码
hello.o 又称为目标文件
(4) 链接 ///将多个.o目标文件、库文件,链接在一起, 生成一个可执行文件
gcc -o hello hello.c
-o 需要生成可执行文件的名字 hello 最终生成的可执行文件的名字
hello可执行文件是需要运行的 ./hello
库文件:printf 是系统实现的,系统会将printf做成库,给开发者用
3. gcc编译多个文件
main.c add.c del.c
main.c
void add();
void del();
int main()
{
add();
del();
return 0;
}
///add.c//
#include <stdio.h>
void add()
{
printf("add\n");
}
///del.c/
#include <stdio.h>
void del()
{
printf("del\n");
}
gcc -o main main.c add.c del.c
4.程序编类型问题
(1) 错误(error) , 如果有error程序编译通不过,运行不了
(2) 警告(warning), 如果程序有警告,可以编译通过,并运行
可能会有问题,或者代码不规范,都是警告
error:
1)
hello.c:6:17: error: ‘b’ undeclared (first use in this function)
hello.c 的第6行,有一个error, b 未定义 (通常是单词写错了)
2)
hello.c:4:1: error: expected declaration specifiers or ‘…’ before ‘{’ token
通常是语法错误,少写了 ; } )
3 )
hello.c:(.text+0x21): undefined reference to `prntf’
collect2: ld returned 1 exit status
链接时的错误,找不到prntf, 通常也是单词写错了
默认情况gcc代码检查不是很严格的,有些警告不显示
如果想显示警告
-Wall 显示所有警告, 建议加-Wall
-w 忽略所有警告, 建议不加此选项
1
hello.c: In function ‘main’:
hello.c:7:1: warning: control reaches end of non-void function [-Wreturn-type]
在main函数中,有一个警告,在第7行,没写返回值
2
hello.c:6:8: warning: ‘a’ is used uninitialized in this function [-Wuninitialized]
a 变量没有被初始化
3
hello.c:5:6: warning: unused variable ‘a’ [-Wunused-variable]
定义了一个变量a,但没使用
5、认识shell脚本
1. 什么是脚本
脚本:新华词典解释——表演戏剧、曲艺,摄制电影等所依据的本子,里面记载台词、故事情节等。
脚本文件,编写脚本代码-----------相当于剧本
解析器,阅读脚本中的代码,根据代码中的指令做事---------相当于演员
常见的脚本语言:
python
js ----- javascript
脚本语言的特点(解释型语言):
脚本语言不需要编译,脚本语言的解析器可以直接阅读脚本语言并按照指令执行。解析器本身就是一个程序,被CPU执行的程序。脚本语言的特点注定脚本语言的执行效率不可能比编译型语言高。
脚本语言简单易学。
编译型语言:
C语言
C++语言
java 是半编译半解释型语言,java虚拟机(jvm)运行java。java虚拟机不是直接运行java代码,java代码也需要编译,但是不是编译给cpu看,而是编译给java虚拟机看。
什么是 shell 脚本 ? linux命令的有序集合。用来批处理linux命令。
shell脚本是专门为了批处理linux指令而诞生的脚本语言,并不适合表达复杂逻辑。
shell脚本的解析器 bash
编程语言分类:
(1)解释性语言: 无需编译,执行即可。
shell
python
html5 (标签语言)
(2)编译型语言: 先编译,在没有错误之后,才能正确运行。
c
c++
2.初识 shell 脚本
1. 开头
#!/bin/bash # 告诉系统,当前脚本由哪个程序运行。
2. 示例:
vi test.sh
#! /bin/bash #告诉系统,使用bash解析器作为当前脚本的解析器
clear # 执行clear命令,清屏
ls # 执行ls 命令
date # 执行date命令 输出日期
touch file.txt #执行touch file.txt
ls # 执行ls命令
3. 脚本的执行
方式一; 添加权限: chmod +x test.sh ./test.sh
方式二: 脚本解释bash : bash test.sh
4. 注释:
#
5. 变量
(1) 为了方便识别变量,变量名通常用大写字符
(2) 不能以数字开头,开头必须是字母或者下划线
(3) 不能使用标点符号
脚本语言是弱类型,定义变量不需要指定类型,直接赋值就可以。
示例:
#! /bin/bash
NUMBER=2 #定义了一个变量,变量里的值是2
echo NUMBER #输出NUMBER 既没有写变量也没有读变量,所以这一行和变量没有关系,仅仅是输出 NUMBER
echo KaTeX parse error: Expected 'EOF', got '#' at position 11: NUMBER #̲在变量前,是读取变量的值,所以这一行输出2
echo 输出一行内容
6. 位置参数 与 预设变量
1)位置参数: 0 1 2 3 4 …
位置参数的值,如何取值: 用$
示例代码:
echo $0
echo $1
echo $2
echo $3
2)预设变量: # *
$# : 位置参数的个数。
$* : 位置参数都有谁,用空格隔开,把所有的位置参数都保存在这个预设变量里
练习:
请编写shell脚本: 创建目录文件,目录文件的名字由位置参数决定。
创建完目录之后,在目录中再创建一个普通文件,名字也由位置参数决定。
7. 功能语句
输出: echo 输出一行
输入: read 输入
示例:
vi read.sh
#! /bin/bash
read -p "enter string1 and string2: " STRING1 STRING2
echo $STRING1 $STRING2
练习:
创建一个目录文件,然后,在此目录下创建一个普通文件。 文件名字由输入决定。
8. “” 与 ''
示例:
#! /bin/bash
FILE=m.txt
echo “$FILE” #不完全输出 用变量的值代替变量
echo ‘$FILE’ #完全输出 完全按照写的样子输出
作业:选择题
1.请阅读以下程序:
main()
{
int a=5,b=0,c=0;
if(a=b+c) printf("***\n");
else printf("$$$\n");
}
以上程序: ( )
A)有语法错不能通过编译 C) 可以通过编译但不能通过连接
B)输出*** D) 输出$$$
2.一个C语言程序是由 ( ) 。
A)一个主程序和若干子程序组成 B)函数组成
C)若干过程组成 D)若干子程序组成
3.若x,i,j和k都是int型变量,则执行下面表达式后x的值为( )。
x=(i=4,j=16,k=32)
A)4 B)16 C)32 D)52
4.0xff的二进制码是( ), 十进制是( )。
-
一个C程序的入口地址是( )。
-
int a = 5 / 3, 执行后a的值为( ), int b = 5 % 3, 执行后b的值为( )
-
下面程序错误的地方有
#include <stdio.h>
int mian()
{
a = 10;
printf(“a is %d\n”, a);
}
-
sizeof(char) = ( ), sizeof(short) = ( ), sizeof(long) = ( )
sizeof(float) = ( ), sizeof(double) = ( )
9 unsigned char表示( ),unsigned char a, a的取值范围是( )
- x = 6, y = 8;
z = ++x + y++;
运行后x的值是( ), y的值是( ),z的值是( )
作业1:
选村长:
请输入三个要竞选村长名字
进行投票10次,相当于选票,统计出结果打印出村长是谁
作业2:
echo “$FILE” #不完全输出 用变量的值代替变量
echo ‘$FILE’ #完全输出 完全按照写的样子输出
作业:选择题
1.请阅读以下程序:
main()
{
int a=5,b=0,c=0;
if(a=b+c) printf("***\n");
else printf("$$$\n");
}
以上程序: ( )
A)有语法错不能通过编译 C) 可以通过编译但不能通过连接
B)输出*** D) 输出$$$
2.一个C语言程序是由 ( ) 。
A)一个主程序和若干子程序组成 B)函数组成
C)若干过程组成 D)若干子程序组成
3.若x,i,j和k都是int型变量,则执行下面表达式后x的值为( )。
x=(i=4,j=16,k=32)
A)4 B)16 C)32 D)52
4.0xff的二进制码是( ), 十进制是( )。
-
一个C程序的入口地址是( )。
-
int a = 5 / 3, 执行后a的值为( ), int b = 5 % 3, 执行后b的值为( )
-
下面程序错误的地方有
#include <stdio.h>
int mian()
{
a = 10;
printf(“a is %d\n”, a);
}
-
sizeof(char) = ( ), sizeof(short) = ( ), sizeof(long) = ( )
sizeof(float) = ( ), sizeof(double) = ( )
9 unsigned char表示( ),unsigned char a, a的取值范围是( )
- x = 6, y = 8;
z = ++x + y++;
运行后x的值是( ), y的值是( ),z的值是( )
作业1:
选村长:
请输入三个要竞选村长名字
进行投票10次,相当于选票,统计出结果打印出村长是谁
作业2:
实现一个随机点名程序,每次运行程序随机打印班级一位同学的名字。