复习
进程
系统为程序运行准备的资源
线程
在进程中运行逻辑的单位
pid linux用来管理进程的标识
ppid 父进程的id
init进程 系统第一个运行的进程,它没有父进程
父进程 在A进程运行时创建了B进程,那么A进程是B进程的父进程,B进程是A进程的子进程
子进程
僵尸进程 进程执行完毕资源没有释放。
孤儿进程 父进程结束时要结束子进程,如果父进程结束子进程没结束,这个子进程叫孤儿进程。此时init进程回来 接管孤儿进程。
ps aux 查看进程详细信息
kill pid 杀死pid对应的进程 kill -9 pid 必杀
find 遍历搜索路径,慢。
which 搜索命令可执行文件所在位置。
locate 在数据库中查找文件位置,不是实时的,sudo updatedb 手动更新数据库
压缩: tar cvfz dir.tar.gz dir
解压缩: tar xvfz dir.tar.gz -C 路径
c 创建压缩文件
x 解压缩
v 显示过程
f 多个文件
z zip格式
cat test.c|grep for 管道符 将左边命令的结果作为右边命令的输入
ls / > file.txt 重定向 改变输出方向 >会覆盖文件原有内容 >>在原文件中追加
ifconfig 查看网络信息
sudo ifconfig eth0 192.168.40.199 给网卡eth0设置ip地址
ping 192.168.40.101 测试网络通不通
gcc 编译
1 预处理 执行include,define
2 编译 将C语言翻译成汇编
3 汇编 将汇编语言翻译成机器码
4 链接 将调用的库函数的函数体编译到自己的可执行文件中
gcc -o test test.c
编译test.c文件,生成可执行文件名叫test
作业:选择题
1.请阅读以下程序:
main()
{
int a=5,b=0,c=0;
if(a=b+c) printf("***\n");
else printf("$$$\n");
}
以上程序: ( D )
A)有语法错不能通过编译 C) 可以通过编译但不能通过连接
B)输出*** D) 输出$$$
2.一个C语言程序是由 ( B ) 。
A)一个主程序和若干子程序组成 B)函数组成
C)若干过程组成 D)若干子程序组成
3.若x,i,j和k都是int型变量,则执行下面表达式后x的值为( C )。
x=(i=4,j=16,k=32)
A)4 B)16 C)32 D)52
4.0xff的二进制码是( 11111111 ), 十进制是( 255 )。
-
一个C程序的入口地址是( main )。
-
int a = 5 / 3, 执行后a的值为( 1 ), int b = 5 % 3, 执行后b的值为( 2 )
-
下面程序错误的地方有
#include <stdio.h>
int mian() //1 main
{
a = 10; //2 a 没声明
printf(“a is %d\n”, a);
}
-
sizeof(char) = ( 1 ), sizeof(short) = ( 2 ), sizeof(long) = ( 4 )
sizeof(float) = ( 4 ), sizeof(double) = ( 8 )
long和int 都是4 long long 8
9 unsigned char表示( 无符号字符型),unsigned char a, a的取值范围是( 0~255 )
- x = 6, y = 8;
z = ++x + y++;
运行后x的值是( 7 ), y的值是( 9 ),z的值是( 15 )
作业1:
选村长:
请输入三个要竞选村长名字
进行投票10次,相当于选票,统计出结果打印出村长是谁
#include <stdio.h>
#include <string.h>
//定义结构体表示一个人
struct Person
{
char name[20];//名字属性
int score;//票数属性
};
int main()
{
struct Person ps[3] = {
{"", 0},
{"", 0},
{"", 0}
};//初始化结构体数组
int i;
for(i = 0;i < 3;i++)
{
scanf("%s", ps[i].name);//ps[i]是一个结构体类型变量ps[i].name得到结构体变量里的name成员,因为name成员本身就是数组,所以ps[i].name得到的是一个数组名
}
for(i = 0;i < 10;i++)//循环10次 进行10次投票
{
char buf[20];//保存输入的名字
scanf("%s", buf);//以输入名字的形式进行投票
int j;
for(j = 0;j < 3;j++)//在三个候选者中找到本次投票的哪一位
{
if(strcmp(buf, ps[j].name)==0)//判断名字相等
{
ps[j].score++;//票数+1
}
}
}
//找最大值
int vill = 0;//假设第一个是最大的
for(i = 1;i < 3;i++)
{
if(ps[i].score > ps[vill].score)
{
vill = i;
}
}
printf("vill is %s\n", ps[vill].name);
//查看结果
for(i = 0;i < 3;i++)
{
printf("%s %d\n", ps[i].name, ps[i].score);
}
return 0;
}
作业2:
实现一个随机点名程序,每次运行程序随机打印班级一位同学的名字。
#include <stdio.h>
#include <stdlib.h>
int main()
{
//我们可以使用一个指针变量指向一个字符串常量
//于是我们定义了一个字符指针数组保存N个字符指针
//这些字符指针将会分别指向N个字符串常量
char* names[] = {
"meiyangyang",
"lanyangyang",
"huitailang",
"xiaohuihui",
"jiaotailang",
"datouerzi"
};
srand(time(0));
int index = rand()%6;
printf("%s\n", names[index]);
return 0;
}
1、认识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
#在任何情况下想使用变量里面的值,要在变量前面加$
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
#!/bin/bash
echo $0
echo $1
echo $2
linux@ubuntu:~/22011$ ./test.sh hehe haha heihei
./test.sh
hehe
haha
#!/bin/bash
echo $3
linux@ubuntu:~/22011$ ./test.sh hehe haha heihei
heihei
2)预设变量: # *
$# : 位置参数的个数。
$* : 位置参数都有谁,用空格隔开,把所有的位置参数都保存在这个预设变量里
shell脚本的定位,是在linux系统中做命令的批处理的脚本语言,并不适合表达严谨的逻辑。
练习:
请编写shell脚本: 创建目录文件,目录文件的名字由位置参数决定。
创建完目录之后,在目录中再创建一个普通文件,名字也由位置参数决定。
./test.sh hehe haha
mkdir hehe
touch hehe/haha
#!/bin/bash
mkdir $1
touch $1/$2
7. 功能语句
输出: echo 输出一行
输入: read 输入 脚本运行后的输入
示例:
vi read.sh
#! /bin/bash
read -p "enter string1 and string2: " STRING1 STRING2
echo $STRING1 $STRING2
练习:
创建一个目录文件,然后,在此目录下创建一个普通文件。 文件名字由输入决定。
#!/bin/bash
read -p "please input dir name" DIRNAME
mkdir $DIRNAME
read -p "please input file name" FILENAME
touch $DIRNAME/$FILENAME
8. “” 与 ''
示例:
#! /bin/bash
FILE=m.txt
echo “$FILE” #不完全输出 用变量的值代替变量
echo ‘$FILE’ #完全输出 完全按照写的样子输出
2、shell 的计算
1. `` :反引号
vi scan.sh
#! /bin/bash
OUTPUT=`ls /` # ls /本来应该是输出, 但是加上反引号后变成了表达式,本应输出的内容变成了表达式的结果赋值给了变量OUTPUT
echo $OUTPUT
在shell脚本里写的所有的命令的用法,和在终端敲命令是一样的。
2.expr 运算语句
expr关键是是“表达式“的缩写
vi calc.sh
#! /bin/bash
NUM1=1
NUM2=6
X=`expr $NUM1 + $NUM2` #反引号和里面的表达式之间不要写空格,+两边的空格必须有
echo " $X " #此处的双引号可以省略
3. 注意:
-
赋值符号的左右两侧一定 不要 有 空格!!!
-
运算符两侧一定 一定 要 放空格
-
乘法运算符号: ‘*’ \* 因为*在linux命令中是通配符,所以shell脚本中的乘法不能用*
练习:
分别简单检测各运算: (加、减、乘(*)、除、模除),自己写+ - ‘*’ / %法运算
3、shell 的 if
1. if 的格式:
if [ 条件 ] #条件为真 执行then []和条件之间必须有空格
then
语句1
elif [ 条件 ]
then
语句2
else
语句3
fi
2. if判断的对象:
3类 字符串 数值 文件类型
1)字符串
示例1:
if [ “aBc” = “abc” ] #判定俩字符串是否相等
then
echo “equal”
fi
示例2:
read -p "enter string : " STRING
if [ -z $STRING ] # 判定是否为空串
then
echo “empty”
fi
练习:
请输入你的名字,判定是否是“xiaoming”同学。
#!/bin/bash
read -p "input name: " NAME
if [ $NAME = "xiaoming" ]
then
echo "yes"
else
echo "no"
fi
2)数值
-eq 相等 equal
-ne 不等 not equal
-gt 大于 greater than
-ge 大于等于 greater equal
-lt 小于 less than
-le 小于等于 less equal
示例:
vi number.sh
read -p "enter number: " NUMBER
if [ $NUMBER -gt 0 ]
then
echo " greater than 0 "
elif [ $NUMBER -eq 0 ]
then
echo "equal to 0 "
else
echo "less than 0 "
fi
练习:
输入两个数A B,判定大小。
A>B 输出 “A>B”
AB 输出“AB”
A<B 输出“A<B”
#!/bin/bash
read -p "input two nums: " NUM1 NUM2
if [ $NUM1 -gt $NUM2 ]
then
echo "A > B"
elif [ $NUM1 -eq $NUM2 ]
then
echo "A == B"
else
echo "A < B"
fi
练习:
输入一个数值,判定此数值是否是偶数。
#!/bin/bash
read -p "input a num: " NUM
if [ `expr $NUM % 2` -eq 0 ]
then
echo "偶数"
else
echo "奇数"
fi
3)文件类型
测试语句:
-f filename 判断文件是否为普通文件 file
-d filename 判断文件是否为目录文件 directory
-e filename 判断文件是否存在 exist
-L filename 判断文件是否为链接文件 link
-w filename 判断是否有写权限 write
-x filename 判断是否有执行权限 excute
示例:
#! /bin/bash
read -p "enter file name : " NAME
if [ -f $NAME ]
then
echo "file "
elif [ -d $NAME ]
then
echo “dir”
fi
练习:
请输入文件名称,判定此文件是否拥有执行权限。 -x
#!/bin/bash
read -p "input a file name: " FILENAME
if [ -x $FILENAME ]
then
echo "yes"
else
echo "no"
fi
练习:
创建一个目录文件,进入目录后,再创建个普通文件。 目录文件和普通文件名都是输入的。
添加条件: 1. 判断该目录文件是否存在:如果存在,就不创建。如果不存在,创建。
判断普通文件是否存在。 -e
#!/bin/bash
read -p "input a dir name: " DIRNAME
if [ -e $DIRNAME ]
then
echo "文件夹已经存在"
else
mkdir $DIRNAME
fi
cd $DIRNAME
read -p "input a file name: " FILENAME
if [ -e $FILENAME ]
then
echo "文件已经存在"
else
touch $FILENAME
fi
4、shell 中的 case
1.格式:
case $(变量) in # 读取变量的值
a)
语句。
;; # 相当于C语言的break
b)
语句。
;;
*) # 相当于C语言的default
;;
esac # case结构结束
示例:
#! /bin/bash
read -p "enter : " WEEK
case $WEEK in
1)
echo “Monday”
;;
5)
echo “Friday”
;;
*)
echo “Other day”
;;
esac
作业:
编写shell脚本,实现按键 asdw 控制输出上下左右
作业:
选择题
- 下面的代码执行后a的值为( )
int a = 10;
if(a = 1)
{
a++;
}
else
{
a--;
}
printf("%d", a);
2 下面的代码a的值是( )
int a = 10;
if(a < 10)
{
a++;
}
- ‘3’ 的Ascii码用16进制表示是( ) 10进制是( )。
4 . int main()
{
int a;
scanf("%d", &a);
switch(a)
{
case 1:
printf("Monday\n");
case 2:
printf("Tuesday\n");
case 3:
printf("Wednesday\n");
default:
printf("Error\n");
}
}
如果用户输入了2, 那么输出是( )
- 如果int a = 3, 输出003,那么输出表达式为( )
6 .下面的语句有什么错误
int main()
{
int a;
scanf("%d", a);
printf("%f", a);
return 0;
}
-
float money = 12.1, 如果输出的金额保留小数点两位,则输出表达是为( )
-
int main()
{
int i = 0, sum = 0;
for(i = 0; i < 100; i++)
{
if(i % 5 == 0)
continue;
sum += i;
}
}
上面程序的作用是( )
- int main()
{
int number = 0;
while(1)
{
scanf("%d", &number);
if(number == 0)
{
break;
}
}
}
上面程序的作用是( )
- for( ; ; )
上面语句的作用是( )
- 下面程序的运行结果为( )。
for(k = 0; k < 5; ++k)
{
if(k == 3)
continue;
printf("%d",k);
}
作业:
}
- ‘3’ 的Ascii码用16进制表示是( ) 10进制是( )。
4 . int main()
{
int a;
scanf("%d", &a);
switch(a)
{
case 1:
printf("Monday\n");
case 2:
printf("Tuesday\n");
case 3:
printf("Wednesday\n");
default:
printf("Error\n");
}
}
如果用户输入了2, 那么输出是( )
- 如果int a = 3, 输出003,那么输出表达式为( )
6 .下面的语句有什么错误
int main()
{
int a;
scanf("%d", a);
printf("%f", a);
return 0;
}
-
float money = 12.1, 如果输出的金额保留小数点两位,则输出表达是为( )
-
int main()
{
int i = 0, sum = 0;
for(i = 0; i < 100; i++)
{
if(i % 5 == 0)
continue;
sum += i;
}
}
上面程序的作用是( )
- int main()
{
int number = 0;
while(1)
{
scanf("%d", &number);
if(number == 0)
{
break;
}
}
}
上面程序的作用是( )
- for( ; ; )
上面语句的作用是( )
- 下面程序的运行结果为( )。
for(k = 0; k < 5; ++k)
{
if(k == 3)
continue;
printf("%d",k);
}
作业:
编写脚本,实现简单的计算功能。 示例: bash a.sh 3 + 4