day1
一、linux系统基础
1、linux和windows
linux:开源、免费、安全性高、稳定性强、可移植性高
2、linux操作系统的基本使用
3、linux的文件的系统结构
windows:所有文件有分盘(C,D,E,F....),每个盘中都有子文件或者子目录,对文件存放没有要求,可以放在任意位置
linux:没有分盘,只有一个大的目录--根目录('/'),根目录下的文件夹每一个都有其固定作用
bin:存放二进制文件或者可执行程序
dev:存放设备文件
etc:系统相关的配置文件
home:用户目录,用户所有操作都在该目录下进行 可以用符号(~)表示
1、基本的shell命令
shell本质:命令行解释器,将用户输入的特定指令转换为系统能够识别的语言
绝对路径:从根目录出发所表示的一个路径
相对路径:相对于用户当前位置所表示的一个路径
pwd:显示当前用户在文件系统中的绝对路径
用法:
pwd + 回车
ls:显示当前用户所在路径下的所有文件(不包含隐藏文件)
用法:
ls + 回车
ls -a:显示当前用户所在路径下的所有文件(包含隐藏文件)
'.' == 用户当前目录
'..' == 当前目录的上一级目录
ls -l:显示当前用户所在路径下的所有文件的详细信息
- rw- rw- r--
第一位代表文件类型:
'-' :普通文件
'd' :目录文件
'c' :字符设备文件
'b' :块设备文件
'p' :管道文件
'l' :符号链接文件
's' :套接字文件
不同操作系统下支持使用的文件类型不同
后9位代表文件存取权限
rw-rw-r-- == 110 110 100 == 0664
权限的前3位表示用户自己的使用权限,如果当前位上没有对应权限用'-'表示
权限的中间3位代表用户组的使用权限
权限的最后3位代表其他用户的使用权限
r -- 具有读权限 w -- 具有写权限 x -- 具有可执行权限
cd: 目录跳转
用法:
cd + 指定路径
touch:以不打开的方式创建一个文件,如果文件存在,则修改时间戳
用法:
touch + 文件名
rm:删除指定文件
用法:
rm + 文件名
cat:显示文件内容
用法:
cat + 文件名
cp: 复制文件
用法:
cp + 源文件名 + 路径名
cp + 源文件名 + 目标文件名
mv:移动文件
用法:
mv + 源文件名 + 路径名
mv + 源文件名 + 目标文件名
mkdir: 创建目录
用法:
mkdir + 目录名
rmdir: 删除指定目录(空目录)
用法:
rmdir + 目录名
删除非空目录:rm -r 目录名
clear:清屏 ctrl + l快捷方式也可以清屏
Tab: 命令补全
2、vim编辑器
shell命令:vi 或者 vim + 文件名
如果文件不存在,则会先创建再进行编辑
vim编辑器中的三种工作模式:
命令行模式:用户在进入编辑器后默认处于的工作模式
在命令行模式下不能直接输入数据,但是可以对文本进行复制、粘贴、剪切、撤销等操作:
在命令行模式下输入:
nyy:将光标以及光标以下的n行数据进行复制
ndd:将光标以及光标以下的n行数据进行剪切
p:将复制或者剪切的内容粘贴到光标的下一行
u:撤回到上一步操作
编辑模式:可以对文本进行编辑操作
在命令行模式下输入:a, i, o都可以进入编辑模式
按Esc退回到命令行模式
底行模式:对文本进行保存、退出等操作
在命令行模式下输入冒号进入底行模式
在底行模式下输入:
w:保存文件
q:退出文件
wq:保存并且退出
q!:强制不保存退出
x:保存并且退出
3、gcc编译工具
shell指令:
gcc + c文件名
编译成功之后会在当前目录下产生一个名为a.out的二进制可执行程序
gcc c文件名 -o 新的二进制可执行文件名
4、执行程序
shell命令:
./可执行的二进制文件名
### chmod--修改文件权限
1、chmod u+x 文件名----给当前用户增加执行权限
如果不加u,默认给所有用户加权限
u--用户自己
g---用户组
o---其他用户
2、chmod 0777 文件名
### 链接文件--ln
硬链接:
ln 文件名 硬链接文件名
硬链接如果把本体文件删掉,依旧可以单独使用,类型和原文件一模一样,移动原文件也依旧可以执行
ln -s 文件名 软链接文件名
大大缩小了文件的大小,如果把本体文件删除或者移动,软链接失效
### 文件的压缩与解压
gzip---压缩文件,原文件被替换成压缩之后的文件,,会生成一个.gz的压缩文件,用vi能看到源文件内容,用cat在终端查看乱码
gunzip---解压文件
bzip2---压缩文件,原文件被替换成压缩之后的文件,,会生成一个.bz2的压缩文件,压缩功能相对于gzip较弱,但是压缩时间缩短
bunzip--解压文件
xz---压缩文件,原文件被替换成压缩之后的文件,,会生成一个.xz的压缩文件,压缩功能相对于gzip较弱,但是压缩时间缩短
unxz--解压文件
day2
## tar-归档和释放
```c
tar
-c 创建归档文件
-v 显示归档或释放过程
-x 释放归档文件
-f 用户指定归档文件的文件名,否则使用默认名称
-j 以bzip2方式压缩
-z 以gzip方式压缩
tar -czvf 要压缩或归档之后的文件名 目标文件名
tar -xvf 要释放之后的文件名 目标文件名
```
![image-20230314201010033](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230314201010033.png)
tar -zcvf 10.gz 1.c 2.c
![image-20230314201312619](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230314201312619.png)
tar -zcvf 区的名字 压缩文件名1 压缩文件名2
## diff
```c
比较文件的不同
```
## grep--查询
```c
grep 查询的字符串 查询文件名---查询特定文件的内容
grep -r 查询的字符串 路径----查询一个路径下所有文件的内容
```
## wc
```c
wc 文件名: 行数 单词个数 单个字符个数 文件名
-l:只查看行数
-w:只查看单词个数(看空格)
-c:只查看单个字符个数
```
# 工具:
vi编辑器
gedit编辑器
gcc编译器
## 下载工具:
deb(常用的) ----Debian
rpm(小红帽)----Redhat
### dpkg工具----离线下载,没有依赖文件
sudo----暂时赋予用户权限,密码初始都为1,但是不显示密码的输入,确保输出按回车就可以了
dpkg都要加sudo
sudo dpkg -i 安装包---下载
sudo dpkg -r 软件名---卸载
### apt工具---在线下载
下载:
sudo apt-get install sl--跑火车
sudo apt-get install frozen-bubble--泡泡龙
sudo apt-get install cmatrix--代码雨
sudo apt-get install fortune----名人名言
sudo apt-get install fortunes-zh----名人名言(中文)
sudo apt-get install lolcat----有颜色显示
fortune | lolcat
卸载:sudo apt-get remove 软件名
### 创建共享文件夹:
1、选择虚拟机左上菜单的虚拟机选项,点击设置
2、点击选项,找到共享文件夹,选择总是启用
3、点击添加,跟着下一步,选择主机(windows)的一个文件作为自己的共享文件夹
4.点击完成,点击确定,最后在/mnt/hgfs查看有没有
### 网络配置:
ping--能不能网络通信
ping +IP地址
1、点击虚拟机菜单的编辑,选择虚拟网络编辑器
2、点击更改设置(如果没有,直接选择桥接模式)
,选择桥接模式
3、在桥接模式下选择自己windos网络的描述名字,点击确定
4、点击虚拟机,选择设置,找到网络适配器,选择自定义模式,选择自己的网络名称(一般为VMnet0),点击确定
5、进入linux系统,断开重连网络(重启网络)
或者:在终端上输入:
sudo service network-manager restart
### ifconfig---查看linux系统的IP地址
ipconfig---查看windows系统的IP地址
## 用户管理
超级用户:su,开通了所有权限,我们一般不在这里工作,因为一旦删除,找不回来,也容易操作到内核上的东西
exit:退出超级用户
查看用户---vi /etc/passwd
查看用户组--vi /etc/group
添加用户:
adduser 新添用户名
输入密码,不显示,确保输入按回车
su 用户名----进入该用户
删除用户---deluser 用户名,但是我们一般进入passwd和group这两个文件去删除(加sudo)
修改密码:passwd
exit:退出
ps 查看前台的进程
ps -aux 查看所有进程
pstree---以树的形式展示进程
top---查看进程(从占用cpu最大开始展示),类似于任务管理器
kill -9 进程号 ----杀死进程
## shell的特殊字符
|---管道
指令1| 指令2----把指令1的输出作为指令2的输入
fortune | lolcat
```c
` `---命令置换
指令1 ` ` 把命令置换里面的内容作为指令1的参数
echo `ls`
```
echo--终端的输出
echo hello world---会自动缩进空格字符串之间保留一个空格
echo ’hello world‘---原样输出
echo ”hello world“---原样输出
输入输出重定向
```c
>:
cat >1.c
覆盖输入
>>:
追加输入
cat >>1.c
```
通配符:
*---匹配所有字符串
{起始..结束}--可以创建起始到结束的文件
touch {1..10}.c
【】
rm 【13579】.c----删除了1.c 3.c 5.c 7.c 9.c
rm [1-5].c----删除了1.c2.c3.c4.c5.c
```c
rm [^8].c 删除除了8.c的文件,也只能通配一个
```
?---匹配一个字符串
rm h?llo.c---删除hello.c hrllo.c
shutdown---关机
shutdown -r now---重启
快照--相当于备份
## shell脚本:
本质:shell命令的有序集合
解释型语言(python,shell脚本)
不会检查错误,但是会显示出错误,出现错误会继续执行后面的语句
需要一个解释器
编译型语言(c语言,c++)
编译会报错,一旦错误会停止进程
怎么去写一个shell脚本:
1、创建一个.sh的文件(也可以没有后缀名)
2、写shell命令
3.执行:
a、通过bash这个解释器来执行,直接bash+要执行的文件
b、通过chmod给shell文件添加执行权限,然后再执行
第一行一般写:#!/bin/bash,我们解释器的路径
练习:复制上一级目录的1.c 2.c到当前目录下,然后把hello world写入1.c
```c
1 #!/bin/bash
2
3 cd ../
4 touch 1.c 2.c
5 cp [12].c day2
6 echo "hello world" >day2/1.c
```
### shell变量
#### 自定义变量
没有数据类型,默认为字符串类型
赋值不能隔开
变量名=值
没有分号,换行就相当于分号
变量的调用需要加钱$
```c
1 #!/bin/bash
2
3 a=12
4 echo $a
```
#### 位置变量
命令行参数的变量
从终端传递参数给shell脚本
```c#
从$0开始到$9如果要打印9以后的变量需要加{},例如${12}
```
#### 环境变量
计算机定义好了的变量
env可以查看所有环境变量
调用需要加$
#### 预定义变量
计算机给一些特殊变量赋予特殊意义
$*--打印的是命令行参数的所有变量,不包括$0
$@--打印的是命令行参数的所有变量,不包括$0
$#--打印的是命令行参数的个数,不包括$0
$?--打印上一次的返回状态(0代表真,1代表假)
day3
tar
diff
grep
wc
工具:vi、gedit、gcc、bash、dpkg、apt、网络配置、共享文件夹
用户管理:adduser、deluser、/etc/passwd、/etc/group、su、exit、passwd
sudo
进程管理:ps、ps -aux、pstree、top、kill -9 进程号
shell的特殊字符:| `` >>通配符:*、{..}、【】、【-】、【^】、?
shell脚本:
shell变量:
自定义变量
位置变量
环境变量
预定义变量
作业:
9 int main(int argc, char *argv[]) 10 { 11 int arr[10]={1,2,3,4,5,6,7,8,9,10}; 12 int temp,i,m; 13 printf("please input a number:\n"); 14 scanf("%d",&m); 15 m=m%10; 16 while(m--) 17 { 18 temp=arr[9]; 19 for(i=9;i>0;i--) 20 { 21 arr[i]=arr[i-1]; 22 } 23 arr[0]=temp; 24 } 25 for(i=0;i<10;i++) 26 { 27 printf("%d ",arr[i]); 28 } 29 puts(""); 30 31 32 return 0;
变量的四则运算:
1、(())
不能进行浮点型的运算
调用的时候需要加钱$
可以进型幂数运算
可以进行自加自减
#!/bin/bash 2 3 a=$(( 3**3)) 4 echo $a
2、【】
不能进行浮点型的运算
调用的时候需要加钱$
可以进型幂数运算
1 #!/bin/bash 2 3 a=$[ 3+3] 4 echo $a
3、expr
需要命令置换符置换出来结果``
算数之间需要空开
当进行乘法的时候需要用\区分
没有幂数运算
1 #!/bin/bash 2 3 a=`expr 1 \* 2` 4 echo $a
练习:运算出a=3的3次方的值,b=5*7的值,交换
1 #!/bin/bash 2 3 a=$((3**3)) 4 b=`expr 5 \* $((4+2))` 5 c=$a 6 a=$b 7 b=$c 8 echo a=${a}b=$b
shell 语句
解释性语句
#注释一行
注释多行
:<<!
注释的shell语句
!
:<<EOF
注释的shell语句
EOF
功能性语句
test
字符串 整型 文件
字符串的比较
test 字符串1 = 字符串2 ----比较两个字符串是否相等
test 字符串1 != 字符串2 ----比较两个字符串是否不相等
test -z 字符串---判断字符串为不为空
test -n 字符串---判断字符串是否不为空
1 #!/bin/bash 2 3 a="hello" 4 b="hello" 5 test $a != $b 6 test -z $a 7 test -n $a 8 echo $?
整型的比较
-eq---等于
-ne---不等于
-gt---大于
-lt--小于
-ge---大于等于
-le---小于等于
文件的比较
-e ---判断文件是否存在
-f---判断文件是否是普通文件
-L---判断文件是否是链接文件
-S---判断文件是否是套接字文件
-b---判断文件是否是块文件
-c---判断文件是否是字符文件
-d---判断文件是否是目录文件
-p---判断文件是否为管道文件
文件的权限:
-r--判断文件是否有可读权限
-w---判断文件是否有可写权限
-x---判断文件是否有可执行权限
文件1 -nt 文件2--判断文件1是否比文件2新(时间戳)
文件1 -ot 文件2--判断文件1是否比文件2旧(时间戳)
-o---或
-a---与
1 #!/bin/bash 2 3 test -d $1 -a -f $2 4 echo $? ~
read
把终端上的输入传给参数
read 变量1 变量2
read -p 提示 变量名
1 #!/bin/bash 2 3 read -p "please input tow numbern:" a b 4 echo $a 5 echo $b
read -t 时间 变量名---限制时间输入
超过时间会自动结束(以秒为单位)
1 #!/bin/bash 2 3 read -t 5 a b 4 echo $a 5 echo $b
read -n --限制输入的个数,超过个数也会自动结束
1 #!/bin/bash 2 3 read -n 1 a b 4 echo $a 5 echo $b ~
read -s ---隐藏输入
控制语句
if
第一种:
if【】
then
shell语句;
fi
注意:if和【】之间要隔一个空,表达式和【】也要隔一个空
1 #!/bin/bash 2 3 a=56 4 b=34 5 if [ $a -gt $b ] 6 then 7 echo "hello world" 8 fi
第二种:
if test语句
then
shell语句;
fi
1 #!/bin/bash 2 3 a=56 4 b=34 5 if test $a -gt $b 6 then 7 echo "hello world" 8 fi
if - elif-else
1 #!/bin/bash 2 3 read a b 4 if test $a -gt $b 5 then 6 echo "hello world" 7 elif test $a -eq $b 8 then 9 echo "zhangcheng" 10 else 11 echo "day3" 12 fi
练习:输入一个文件名。判断这个文件是否存在,如果不存在,就创建,判断是否有可写权限,如果有,就把helloworld 写进去,如果没有,赋予可写权限,再写进去,如果存在就写入helloworld
1 #!/bin/bash 2 3 read -p "please input a filename:" file 4 if test -e $file 5 then 6 if test -w $file 7 then 8 echo "hello world">>$file 9 else 10 chmod +w $file 11 echo "hello world">>$file 12 fi 13 else 14 touch $file 15 echo "hello world">>$file 16 fi
case 表达式 in
表达式)
shell语句
;;
表达式)
shell语句
;;
esac
3 read a 4 case $a in 5 1|2|3) 6 echo "星期一" 7 ;; 8 2) 9 echo "星期二" 10 ;; 11 3) 12 echo "星期三" 13 ;; 14 4) 15 echo "星期四" 16 ;; 17 5) 18 echo "星期五" 19 ;; 20 6) 21 echo "星期六" 22 ;; 23 7) 24 echo "星期天" 25 ;; *) 27 echo "asdads" 26 esac
用【】
read a 4 case $a in 5 [a-zA-Z]) 6 echo "星期一" 7 ;; 8 [zbc]) 9 echo "星期二" 10 ;;
练习:模拟一个应用下载
1 #!/bin/bash 2 3 read -p "请选择要下载的应用:" app 4 read -p "请确认是否下载y|n|q)" chioce 5 case $chioce in 6 Y|y|yes) 7 echo "$app正在下载中....." 8 ;; 9 N|n|no) 10 echo "取消下载$app" 11 ;; 12 *) 13 echo "退出" 14 esac 15
循环语句
while 表达式
do
shell语句
done
1 #!/bin/bash 2 3 a=5 4 while test $a -gt 0 5 do 6 ((a--)) 7 echo $a 8 done
死循环
while true
do
shell语句
done
for
for((表达式1;表达式2;表达式3))
do
shell语句
done
1 #!/bin/bash 2 3 4 i=5 5 for((i=0;i<5;i++)) 6 do 7 echo $i 8 done
for 变量 in 单词表
do
shell语句
done
1 #!/bin/bash 2 3 4 i=5 5 for i in he li oi asda adsa ada ad 6 do 7 echo $i 8 done
连续的
for 变量 in {起始..结束}
1 #!/bin/bash 2 3 4 i=5 5 for i in {a..z} 6 do 7 echo $i 8 done
for 变量 in ``
1 #!/bin/bash 2 3 4 i=5 5 for i in `ls` 6 do 7 echo $i 8 done
练习:求1到100的和
1 #!/bin/bash 2 3 sum=0 4 i=5 5 for((i=0;i<101;i++)) 6 do 7 sum=$(($sum+$i)) 8 done 9 echo "sum=$sum" 1 #!/bin/bash 2 3 sum=0 4 i=5 5 for((i=0;i<101;i++)) 6 do 7 sum=`expr $sum + $i` 8 done 9 echo "sum=$sum"
shell数组
shell脚本里面只有一维数组
没有数据类型
数组的初始化
数组名=(元素1 元素2 元素3.。。。)
数组的赋值:
数组名【下标】=内容
数组的调用:
${数组名【下标】}
数组的遍历:
循环遍历
${arr[*]}
${arr[@]}
求数组的长度:${#arr[*]}
1 #!/bin/bash 2 3 arr=(hello world nihao shijie) 4 arr[0]="zhangcheng" 5 echo ${arr[0]} 6 echo ${arr[@]} 7 echo ${#arr[*]} ~
练习:
数组的逆序打印(用交换)
shijie nihao world hello
1 #!/bin/bash 2 3 arr=(hello world nihao shijie) 4 arr[0]="zhangcheng" 5 echo ${arr[0]} 6 echo ${arr[@]} 7 len=${#arr[*]} 8 for((i=0;i<$len/2;i++)) 9 do 10 temp=${arr[$i]} 11 arr[$i]=${arr[$(($len-$i-1))]} 12 arr[$(($len-$i-1))]=$temp 13 done 14 15 echo ${arr[@]}
shell函数
没有数据类型
没有写形参,但可以传参
只有调用函数之后,函数里面的变量才会生效
函数里面定义的都是全局变量,如果要定义局部变量,加local
函数的一般形式:
function 函数名()
{
函数体
}
函数名()
{
函数体
}
函数的调用,直接函数名
返回值return,可以通过$?来打印函数的返回值,如果有返回值,返回在0~256
1 #!/bin/bash 2 3 add() 4 { 5 a=12 6 return $a 7 } 8 add 9 echo $?
函数的传参
函数名 实参1 实参2.。。。
函数体中用$1,$2$3.....来接受传递的实参 1 #!/bin/bash 2 3 add() 4 { 5 a=12 6 echo $1 7 echo $2 8 echo $3 9 return $a 10 } 11 add 34 56 78 12 echo $?
练习:写一个求和函数
1 #!/bin/bash 2 read m n 3 add() 4 { 5 sum=0 6 for((i=$1;i<=$2;i++)) 7 do 8 sum=$(($sum+$i)) 9 done 10 } 11 add m n 12 echo $sum