7天Linux基础语法
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 要释放之后的文件名 目标文件名
```

tar -zcvf 10.gz 1.c 2.c

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/bash2 3 a=$(( 3**3))4 echo $a
2、【】
不能进行浮点型的运算
调用的时候需要加钱$
可以进型幂数运算
1 #!/bin/bash2 3 a=$[ 3+3]4 echo $a
3、expr
需要命令置换符置换出来结果``
算数之间需要空开
当进行乘法的时候需要用\区分
没有幂数运算
1 #!/bin/bash2 3 a=`expr 1 \* 2`4 echo $a
练习:运算出a=3的3次方的值,b=5*7的值,交换
1 #!/bin/bash2 3 a=$((3**3))4 b=`expr 5 \* $((4+2))`5 c=$a6 a=$b7 b=$c8 echo a=${a}b=$b
shell 语句
解释性语句
#注释一行
注释多行
:<
注释的shell语句
!
:< 注释的shell语句 EOF test 字符串 整型 文件 字符串的比较 test 字符串1 = 字符串2 ----比较两个字符串是否相等 test 字符串1 != 字符串2 ----比较两个字符串是否不相等 test -z 字符串---判断字符串为不为空 test -n 字符串---判断字符串是否不为空 整型的比较 -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---与 把终端上的输入传给参数 read 变量1 变量2 read -p 提示 变量名 read -t 时间 变量名---限制时间输入 超过时间会自动结束(以秒为单位) read -n --限制输入的个数,超过个数也会自动结束 read -s ---隐藏输入 if 第一种: if【】 then shell语句; fi 注意:if和【】之间要隔一个空,表达式和【】也要隔一个空 第二种: if test语句 then shell语句; fi if - elif-else 练习:输入一个文件名。判断这个文件是否存在,如果不存在,就创建,判断是否有可写权限,如果有,就把helloworld 写进去,如果没有,赋予可写权限,再写进去,如果存在就写入helloworld case 表达式 in 表达式) shell语句 ;; 表达式) shell语句 ;; esac 用【】 练习:模拟一个应用下载 循环语句 while 表达式 do shell语句 done 死循环 while true do shell语句 done for for((表达式1;表达式2;表达式3)) do shell语句 done for 变量 in 单词表 do shell语句 done 连续的 for 变量 in {起始..结束} for 变量 in `` 练习:求1到100的和 shell脚本里面只有一维数组 没有数据类型 数组的初始化 数组名=(元素1 元素2 元素3.。。。) 数组的赋值: 数组名【下标】=内容 数组的调用: ${数组名【下标】} 数组的遍历: 循环遍历 ${arr[*]} ${arr[@]} 求数组的长度:${#arr[*]} 练习: 数组的逆序打印(用交换) shijie nihao world hello 没有数据类型 没有写形参,但可以传参 只有调用函数之后,函数里面的变量才会生效 函数里面定义的都是全局变量,如果要定义局部变量,加local 函数的一般形式: function 函数名() { 函数体 } 函数名() { 函数体 } 函数的调用,直接函数名 返回值return,可以通过$?来打印函数的返回值,如果有返回值,返回在0~256 函数的传参 函数名 实参1 实参2.。。。 练习:写一个求和函数功能性语句
1 #!/bin/bash2 3 a="hello"4 b="hello"5 test $a != $b6 test -z $a7 test -n $a8 echo $?
1 #!/bin/bash2 3 test -d $1 -a -f $24 echo $?
~
read
1 #!/bin/bash2 3 read -p "please input tow numbern:" a b4 echo $a5 echo $b
1 #!/bin/bash2 3 read -t 5 a b4 echo $a5 echo $b
1 #!/bin/bash2 3 read -n 1 a b4 echo $a5 echo $b
~
控制语句
1 #!/bin/bash2 3 a=564 b=345 if [ $a -gt $b ]6 then7 echo "hello world"8 fi
1 #!/bin/bash2 3 a=564 b=345 if test $a -gt $b6 then7 echo "hello world"8 fi
1 #!/bin/bash2 3 read a b4 if test $a -gt $b5 then6 echo "hello world"7 elif test $a -eq $b8 then9 echo "zhangcheng"10 else11 echo "day3"12 fi
1 #!/bin/bash2 3 read -p "please input a filename:" file4 if test -e $file5 then6 if test -w $file7 then8 echo "hello world">>$file9 else10 chmod +w $file11 echo "hello world">>$file12 fi13 else14 touch $file15 echo "hello world">>$file16 fi
3 read a4 case $a in5 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 a4 case $a in5 [a-zA-Z])6 echo "星期一"7 ;;8 [zbc])9 echo "星期二"10 ;;
1 #!/bin/bash2 3 read -p "请选择要下载的应用:" app4 read -p "请确认是否下载y|n|q)" chioce5 case $chioce in6 Y|y|yes)7 echo "$app正在下载中....."8 ;;9 N|n|no)10 echo "取消下载$app"11 ;;12 *)13 echo "退出"14 esac15
1 #!/bin/bash2 3 a=54 while test $a -gt 05 do6 ((a--))7 echo $a8 done
1 #!/bin/bash2 3 4 i=55 for((i=0;i<5;i++))6 do7 echo $i8 done
1 #!/bin/bash2 3 4 i=55 for i in he li oi asda adsa ada ad6 do7 echo $i8 done
1 #!/bin/bash2 3 4 i=55 for i in {a..z}6 do7 echo $i8 done
1 #!/bin/bash2 3 4 i=55 for i in `ls`6 do7 echo $i8 done
1 #!/bin/bash2 3 sum=04 i=55 for((i=0;i<101;i++))6 do7 sum=$(($sum+$i))8 done9 echo "sum=$sum"1 #!/bin/bash2 3 sum=04 i=55 for((i=0;i<101;i++))6 do7 sum=`expr $sum + $i`8 done9 echo "sum=$sum"
shell数组
1 #!/bin/bash2 3 arr=(hello world nihao shijie)4 arr[0]="zhangcheng"5 echo ${arr[0]}6 echo ${arr[@]}7 echo ${#arr[*]}
~
1 #!/bin/bash2 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 do10 temp=${arr[$i]}11 arr[$i]=${arr[$(($len-$i-1))]}12 arr[$(($len-$i-1))]=$temp13 done14 15 echo ${arr[@]}
shell函数
1 #!/bin/bash2 3 add()4 {5 a=126 return $a7 }8 add9 echo $?
函数体中用$1,$2$3.....来接受传递的实参
1 #!/bin/bash2 3 add()4 {5 a=126 echo $17 echo $28 echo $39 return $a10 }11 add 34 56 7812 echo $?
1 #!/bin/bash2 read m n3 add()4 {5 sum=06 for((i=$1;i<=$2;i++))7 do8 sum=$(($sum+$i))9 done10 }11 add m n12 echo $sum
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
