From Zero To Hero
课程文档连接:百度网盘https://pan.baidu.com/s/1ZD8LdV9UJrLAmEwdt4jg9w
提取码:3k3q
【如果觉得本文有收获请点个赞八】
本文记录了笔者的shell学习过程和leetcode的精选四题解法。
本笔记是尚硅谷视频的学习笔记,视频链接:https://www.bilibili.com/video/BV14a4y1e71S?p=4
内容较多,边看视频边写,花了四天才整理完,适合收藏作为突击资料,或视频的复习内容~ 文章内不好展示的地方标出了视频对应的时间节点。
Linux中一切皆文件,常见的结构如下
下面介绍各个文件夹的作用:
(lib: library放各种库)
Vim是在vi上进阶的一款编辑器,两者功能相同,都是类Unix系统中通用的文本编辑器,但vim还可以自动上色与判断逻辑
vi install.log
vim install.log
使用vim打开一个文件后,自动进入“一般模式”,可以复制、黏贴、删除,但是不能插入或删除内容。复制删除等都有快捷键。
注意:shift+^快速移动到行头;shift+$快速移动到尾部。
按下 : 或者 / 或者 ?,开启指令模式,光标移动到文本的最后一行
补充 :wq 是保存并退出
shutdown -h 7
则为7分钟后关机
man ls
如果man现实不了,就用help查看shell内置命令
如
help cd
讲到了绝对路径,介绍一下cd的逻辑
如
cd /桌面
则认为是绝对路径 : /桌面,因为第一个/已经指向了文件系统的最开始,一般正确写法是:
cd /root/桌面
相对路径则直接
cd 桌面/文件夹
使用 -p 参数可以创建多层目录,如
mkdir first
mkdir first/second
两行等价于一行
mkdir -p first/second
rmdir只能删除空文件夹
如文件夹内有内容,则执行失败
rmdir empty
可以写路径
touch first/onefile.txt
cp -r 递归复制整个文件夹
cp -r row new
row为原位置,new为新位置
强制覆盖 不提示: \cp
全屏显示
more onefile.config
less和more基本相同,唯一区别的less在读写大文件时效率更高
echo -e "Hallow\tworld"
echo -e "Hallow \\ tworld"
若不空格可能无法显示转义后的 \
rm -rf deletefile.txt
直接
history
rxw对于目录和文件的意义是不同的
例子:
详细解释在视频第4分钟
连接数的含义:
硬链接和软连接区别
软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块,因此软链接的创建与使用没有类似硬链接的诸多限制。
但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接(如下所示的软链接 a 使用了相对路径,因此不宜被移动),因为链接数据块中记录的亦是相对路径指向。
关于mode=421法,详细解释在视频第4分钟
最常用的当然是
chmod 777 filenam
但是这样写是在是显示不出我们的能力。
实例:
所有者:第一个用户名 atguigu 权限 rw-
所属组:第二个用户名 atguigu 权限【正好是高亮部分】 rw-
其他人:只有读权限 r–
现在想给所有人用a.sh这个脚本:
chmod +x a.sh
chmod o-x a.sh
只要Bash有执行脚本的权限,就能执行
bash a.sh
而运行该命令的用户不一定要有a.sh的x权限
但是自执行则一定要有x权限
./a.sh
注意,如果写自执行的脚本,首先应当注意是否指定了编译器
即上图中的
#!/bin/bash
从指定目录开始逐步递归其所有子文件夹
格式: 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
管道符号 | 表示将前一个指令结果输出给后一个指令处理。
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/
查找 “命令”在哪个文件夹下
查找ll命令在哪个文件夹:
which ll
gzip file
gunzip file.gz
gzip只能压缩文件,不能压缩目录
zip -r newname.zip file
unzip -d newfolder
讲解在视频第9分钟
例子:
tar -zcvf dabao.tar.gz file1.txt file2.txt
解压缩【指定路径myfolder】
tar -zxcf dabao.tar.gz -C myfolder
不太用得到,视频
ps aux
kill -9 5103
killall firefox
例子
pstree -p
pstree -u
【感觉没啥用】进程树讲解在视频第九分钟
格式: top [指令]
先输入top ,再在监视界面输入操作命令:
如:查看端口是否被占用
netstat -nlp | grep 8888
crontab -l
打开定时任务的编辑界面(类似vim进去了)
crontab -e
rpm -qa | grep firefox
rpm -r --nodeps firefox
yum -y install firefox.x86_64
类似conda,yum也要换成163源
shell类似外层程序调用linux内核的中间阶段
同样作为命令行解释器,python越来越有取代shell的趋势,后续刷题中也会介绍shell和puyhon的两种解法
cat /etc/shells
每种都是不同的shell语言,bash兼容了难用的sh,因此出现多种语法和奇怪语法。
查看本机的默认shell语法:
echo $SHELL
脚本(Script),是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。在本文中,指命令行的集合。
指定编译器,
#!/bin/bash
类似py的
#--*--coding: utf-8 --*--
先touch test.sh, 再vim进去。写入:
#!/bin/bash
echo "Hello world"
(在win的gitbash内没有权限问题)
自执行:
./test721.sh
但在gitbash里是默认有x权限的
具体修改权限设置请参照上文的chmod节,本部分专注于脚本语言本身。
只要Bash有执行脚本的权限,就能执行
bash a.sh
而运行该命令的用户不一定要有a.sh的x权限
但是自执行则一定要有x权限
./a.sh
注意,如果写自执行的脚本,首先应当注意是否指定了编译器
即上图中的
#!/bin/bash
如果写错了,会报坏解释器interpreter
如果是python,则为
#!user/bin/python
即python解释器的位置
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
是一个,所以要严格空格隔开
[i=5]
查看返回值方法:
#?
【特殊符号,返回上一个脚本的结束符,0为正常运行,1为错误运行】
上图a和6不相等,返回1。下面的数值比较与之相同。要点:空格不能少
例子:
重点:
fi封住if
esac封住case·
恰好是倒过来。
基本语法:
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
例子:
下面编写脚本:如果存在一个叫bbbb的文件,就输出内容,不存在就新建一个内容为123,名字为bbbb的文件:
#!/bin/bash
if [ -f bbbb]
then
cat bbbb
else
touch bbbb
echo b >> bbbb
重点:
;;
代表break例子:参数1输出1111,参数2输出2222,参数3输出3333
#!/bin/bash
case $l in
"1")
echo 111
;;
"2")
echo 2222
;;
*)
echo 3333
;;
esac
基本语法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"