From Zero To Hero
课程文档连接:百度网盘https://pan.baidu.com/s/1ZD8LdV9UJrLAmEwdt4jg9w
提取码:3k3q
【如果觉得本文有收获请点个赞八👍】
【零基础】一文穿起linux结构、Bash指令、shell编程入门
学习笔记
本文记录了笔者的shell学习过程和leetcode的精选四题解法。
本笔记是尚硅谷视频的学习笔记,视频链接:https://www.bilibili.com/video/BV14a4y1e71S?p=4
内容较多,边看视频边写,花了四天才整理完,适合收藏作为突击资料,或视频的复习内容~ 文章内不好展示的地方标出了视频对应的时间节点。
入门-Linux
文件结构与内容
Linux中一切皆文件,常见的结构如下
下面介绍各个文件夹的作用:
(lib: library放各种库)
Vi和Vim编辑器
Vim是在vi上进阶的一款编辑器,两者功能相同,都是类Unix系统中通用的文本编辑器,但vim还可以自动上色与判断逻辑
Vi打开文件【黑白电视】
vi install.log
Vim打开文件【彩色电视】
vim install.log
一般模式
使用vim打开一个文件后,自动进入“一般模式”,可以复制、黏贴、删除,但是不能插入或删除内容。复制删除等都有快捷键。
注意:shift+^快速移动到行头;shift+$快速移动到尾部。
编辑模式
按下 I A O R四个键中的一个,才会开启编辑模式
指令模式
按下 : 或者 / 或者 ?,开启指令模式,光标移动到文本的最后一行
补充 :wq 是保存并退出
总结文本编辑
Linux运行级别
关机重启的顺序和语法
补充: shutdown -h 分钟 是xx分钟后关机,如
shutdown -h 7
则为7分钟后关机
帮助文档
man指令可以查看指令的帮助文档
如
man ls
如果man现实不了,就用help查看shell内置命令
如
help cd
常用快捷键总结
- Tab键可以补全代码,善用!
- ctrl + L 清屏
- 上下键查找已经执行过的指令
文件目录类指令
pwd 显示当前工作目录的绝对路径
cd 时的绝对路径和相对路径
讲到了绝对路径,介绍一下cd的逻辑
如
cd /桌面
则认为是绝对路径 : /桌面,因为第一个/已经指向了文件系统的最开始,一般正确写法是:
cd /root/桌面
相对路径则直接
cd 桌面/文件夹
创建多层目录
使用 -p 参数可以创建多层目录,如
mkdir first
mkdir first/second
两行等价于一行
mkdir -p first/second
防止误删的 rmdir
rmdir只能删除空文件夹
如文件夹内有内容,则执行失败
rmdir empty
创建文件
可以写路径
touch first/onefile.txt
复制和复制时覆盖
cp -r 递归复制整个文件夹
cp -r row new
row为原位置,new为新位置
强制覆盖 不提示: \cp
mv两个功能
cat查看内容【小文件】
more 查看内容【大文件】
全屏显示
more onefile.config
less 查看内容【超大文件】
less和more基本相同,唯一区别的less在读写大文件时效率更高
echo 输出内容到指示台
例子:
echo -e "Hallow\tworld"
echo -e "Hallow \\ tworld"
若不空格可能无法显示转义后的 \
head显示文件头部内容
tail显示文件尾部内容
监视文件变化可以用tail
>覆盖和>>追加
ln软连接【类似快捷方式】
软连接效果示意:
软连接闪烁说明内容已经丢失
rm移除文件或目录
常用写法:
rm -rf deletefile.txt
history查看已经执行过的命令
直接
history
用户群组管理
这里直接贴图了
效果:
加了 - 之后多了 tangseng文件夹
文件权限类操作
文件权限编号
rxw对于目录和文件的意义是不同的
例子:
详细解释在视频第4分钟
连接数的含义:
硬链接和软连接的区别
软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块,因此软链接的创建与使用没有类似硬链接的诸多限制。
但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接(如下所示的软链接 a 使用了相对路径,因此不宜被移动),因为链接数据块中记录的亦是相对路径指向。
chmod权限管理
关于mode=421法,详细解释在视频第4分钟
最常用的当然是
chmod 777 filenam
但是这样写是在是显示不出我们的能力。
实例:
所有者:第一个用户名 atguigu 权限 rw-
所属组:第二个用户名 atguigu 权限【正好是高亮部分】 rw-
其他人:只有读权限 r–
现在想给所有人用a.sh这个脚本:
chmod +x a.sh
运行结果
如果不想让陌生人有权限,则执行
chmod o-x a.sh
这样o组就没有x权限了:
bash和自执行的权限不同
只要Bash有执行脚本的权限,就能执行
bash a.sh
而运行该命令的用户不一定要有a.sh的x权限
但是自执行则一定要有x权限
./a.sh
注意,如果写自执行的脚本,首先应当注意是否指定了编译器
即上图中的
#!/bin/bash
改变所有者
搜索查询类
find
从指定目录开始逐步递归其所有子文件夹
格式: find 搜索范围 选项
选项:
范例1:通过名称查找
在target文件夹下找所有的.txt文件
find target/ -name "*.txt"
范例2:通过所有者查找
在target文件夹下找所有拥有者为xiaoming的文件
find taget/ -user xiaoming
范例3:通过文件大小查找
查找所有target文件夹下大小超过200m的文件,注意find指令是以b为单位的
选项+n大于 -n小于 n 等于
find target/ -size +204800
grep匹配和管道符|配合ls列出文件夹内容参数
管道符 |
管道符号 | 表示将前一个指令结果输出给后一个指令处理。
-
ls 参数
-a 表示显示所有文件,包含隐藏文件
-d 表示显示目录自身的属性,而不是目录中的内容
-F 选项会在显示目录条目时,在目录后加一个/
字符串匹配查找,只输出符合条件的 -
字符串匹配grep语法和re库相同, ^表示开头匹配相同,$表示结尾匹配相同
- 显示匹配行号
ls | grep -n test
- 开头匹配:
ls -l | grep '^d'
drwxrwxr-x 2 roaddb roaddb 4096 May 7 10:11 111
drwxrwxr-x 2 roaddb roaddb 4096 Mar 13 2017 SSL_files
- 结尾匹配
ls -F | grep '/$'
111/
SSL_files/
which查找命令
查找 “命令”在哪个文件夹下
查找ll命令在哪个文件夹:
which ll
压缩和解压缩类指令
gzip(注意不会保留源文件,且不能用于目录)压缩为.gz文件
gzip file
gunzip file.gz
gzip只能压缩文件,不能压缩目录
zip和unzip(注意unzip的指定解压路径)
注意zip要取名字才能压缩
zip -r newname.zip file
unzip -d newfolder
tar打包
压缩:-zcvf
解压:-zxvf
讲解在视频第9分钟
例子:
tar -zcvf dabao.tar.gz file1.txt file2.txt
解压缩【指定路径myfolder】
tar -zxcf dabao.tar.gz -C myfolder
磁盘分区类指令
不太用得到,视频
进程控制类命令
ps查看进程
例子:
ps aux
内容说明
实例讲解:视频第4分钟
kill终止进程
例子
kill -9 5103
killall firefox
pstree查看进程树
例子
pstree -p
pstree -u
【感觉没啥用】进程树讲解在视频第九分钟
top显示系统健康状态【查看僵尸进程、利用率】
格式: top [指令]
先输入top ,再在监视界面输入操作命令:
netstat查看网络端口占用
如:查看端口是否被占用
netstat -nlp | grep 8888
crontab创建定时任务
例子:
查询所有定时任务
crontab -l
打开定时任务的编辑界面(类似vim进去了)
crontab -e
编辑界面:
注意不要同时设置几号和星期几
详细讲解:视频第10分钟
RPM软件包以及YUM仓库
rpm -qa查询软件包
如查看firefox的安装包
rpm -qa | grep firefox
rpm -e卸载
注意:如果不检查依赖,其他用到的程序可能无法启动
例子
rpm -r --nodeps firefox
rpm 安装
yum仓库【类似conda】
例子:yum安装firefox
yum -y install firefox.x86_64
类似conda,yum也要换成163源
入门-Shell编程
shell类似外层程序调用linux内核的中间阶段
同样作为命令行解释器,python越来越有取代shell的趋势,后续刷题中也会介绍shell和puyhon的两种解法
查看系统支持的所有shell语言
cat /etc/shells
每种都是不同的shell语言,bash兼容了难用的sh,因此出现多种语法和奇怪语法。
查看本机的默认shell语法:
echo $SHELL
centOS中,sh已经被软连接到bash
脚本入门
脚本(Script),是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。在本文中,指命令行的集合。
开头
指定编译器,
#!/bin/bash
类似py的
#--*--coding: utf-8 --*--
Hello world
先touch test.sh, 再vim进去。写入:
#!/bin/bash
echo "Hello world"
就可以:
自执行权限
(在win的gitbash内没有权限问题)
自执行:
./test721.sh
在linux中无法运行,因为:
所有者也没有x权限
但在gitbash里是默认有x权限的
具体修改权限设置请参照上文的chmod节,本部分专注于脚本语言本身。
只要Bash有执行脚本的权限,就能执行
bash a.sh
而运行该命令的用户不一定要有a.sh的x权限
但是自执行则一定要有x权限
./a.sh
注意,如果写自执行的脚本,首先应当注意是否指定了编译器
即上图中的
#!/bin/bash
如果写错了,会报坏解释器interpreter
如果是python,则为
#!user/bin/python
即python解释器的位置
Shell 脚本变量
- 所有变量都是字符串型,没有别的型
- 想echo输出时,前面加上$符号
如:
i=0
echo $i
也可以在命令行中直接写
由于字符串特性,不能做加减操作
除了自己定义的变量,还有系统内自带的变量
如$USER
常用系统变量
$HOME、$PWD、$SHELL、$USER等
显示当前Shell中所有变量:
set
自定义变量注意点
1.基本语法
(1)定义变量:变量=值 【千万不能有空格!】
(2)撤销变量:unset 变量
(3)声明静态变量:readonly变量,注意:不能unset
如
readonly i=5
则不能重新赋值,也不能unset i
因为这个变量定义到了当前的shell里
可以新建一个ssh窗口,新建一个终端,都可以清除该变量。bash端口相当于一个占内存的程序,可以用
ps -ef
查看到bash进程
2.变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
特殊变量
特殊变量:$n
1.基本语法
$n (功能描述:n为数字,$0代表该脚本名称,$1-$9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 ${10}
2.案例实操
(1)输出该脚本文件名称、输入参数1和输入参数2 的值
[atguigu@hadoop101 datas]$ touch parameter.sh
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
[atguigu@hadoop101 datas]$ chmod 777 parameter.sh
[atguigu@hadoop101 datas]$ ./parameter.sh cls xz
./parameter.sh cls xz
4.4 特殊变量:$#
1.基本语法
$# (功能描述:获取所有输入参数个数,常用于循环)。
2.案例实操
(1)获取输入参数的个数
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
[atguigu@hadoop101 datas]$ chmod 777 parameter.sh
[atguigu@hadoop101 datas]$ ./parameter.sh cls xz
parameter.sh cls xz
2
4.5 特殊变量:$*、$@
1.基本语法
$*
(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@
(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
2.案例实操
(1)打印输入的所有参数
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[atguigu@hadoop101 datas]$ bash parameter.sh 1 2 3
parameter.sh 1 2
3
1 2 3
1 2 3
4.6 特殊变量:$?
1.基本语法
$?
(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
2.案例实操
(1)判断helloworld.sh脚本是否正确执行
[atguigu@hadoop101 datas]$ ./helloworld.sh
hello world
[atguigu@hadoop101 datas]$ echo $?
0
如搭配逻辑运算
运算
基本语法
(1)
$((运算式))
或者
$[运算式]
(2)expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
例子:
另一种写法
第二种写法解释:expr是一个函数,后面都是参数,$a
是一个,+是一个,$b
是一个,所以要严格空格隔开
条件判断
- 1.基本语法
[ condition ](注意condition前后要有空格)
如
[i=5]
注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
查看返回值方法:
#?
【特殊符号,返回上一个脚本的结束符,0为正常运行,1为错误运行】
上图a和6不相等,返回1。下面的数值比较与之相同。要点:空格不能少
- 2 常用判断条件
-
- (1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
- (1)两个整数之间比较
-
- (2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
- (2)按照文件权限进行判断
-
- (3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
- (3)按照文件类型进行判断
例子:
- 数值判断
- 权限判断
流程控制
重点:
fi封住if
esac封住case·
恰好是倒过来。
基本语法:
if
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
例子:
注意结尾fi
封住
效果:【注意参数不同了结果也不同】
下面编写脚本:如果存在一个叫bbbb的文件,就输出内容,不存在就新建一个内容为123,名字为bbbb的文件:
#!/bin/bash
if [ -f bbbb]
then
cat bbbb
else
touch bbbb
echo b >> bbbb
case
重点:
- 不写swich
;;
代表break- 单括号不扩死
例子:参数1输出1111,参数2输出2222,参数3输出3333
#!/bin/bash
case $l in
"1")
echo 111
;;
"2")
echo 2222
;;
*)
echo 3333
;;
esac
效果:
for 循环
基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
附录-虚拟机服务相关
service iptables stop :临时关闭防火墙(service指令)
chkconfig iptables off :关闭开机自启防火墙(chkconfig指令)
虚拟机准备:
1. 防火墙关闭
service iptables stop //服务关闭
chkconfig iptables off //关闭开机自启
2. 创建一个一般用户atguigu
useradd atguigu
passwd atguigu
3. 在/opt目录下创建software module文件夹
mkdir /opt/software /opt/module
chown atguigu:atguigu /opt/software /opt/module
4. 把这个用户加到sudoers
vim /etc/sudoers
atguigu ALL=(ALL) NOPASSWD: ALL
:wq!强制保存
5. 改Hosts
vim /etc/hosts
在文件后追加
192.168.1.100 hadoop100
192.168.1.101 hadoop101
192.168.1.102
hadoop102
192.168.1.103 hadoop103
192.168.1.104 hadoop104
192.168.1.105
hadoop105
192.168.1.106 hadoop106
192.168.1.107 hadoop107
192.168.1.108
hadoop108
192.168.1.109 hadoop109
(每克隆一台都需要做一遍)
6. 改静态IP
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.2
DNS1=192.168.1.2
NAME=eth0
7. 改主机名
vim /etc/sysconfig/network
改HOSTNAME字段
改成 HOSTNAME=hadoop100
拍快照
//新虚拟机,不用第八步
8. 改网卡脚本文件
vim /etc/udev/rules.d/70-persistent-net.rules
第一行删掉
第二行
最后 NAME="eth1" 改成 NAME="eth0"