Linux 基础笔记
命令是什么?
在终端中输入特定字符串或使用设定好的快捷方式,shell(壳) 根据用户输入的指令,去执行相应的程序。
SHELL
用于用户和系统进行交互的的一类软件。
1.sh
2.bash (csh .tcsh .zsh)
Shell内部命令(了解)
alias, bg, bind, break, builtin, caller, cd, command,
compgen, complete, compopt, continue, declare, dirs, disown, echo,
enable, eval, exec, exit, export, false, fc, fg, getopts, hash, help,
history, jobs, kill, let, local, logout, mapfile, popd, printf,
pushd, pwd, read, readonly, return, set, shift, shopt, source, sus‐
pend, test, times, trap, true, type, typeset, ulimit, umask, unalias,
unset, wait - bash built-in commands
# 查看命令的类型
3.type 命令名
# 查看命令的帮助文档
4.man 命令名
命令 --help # 显示命令参数
# 查看文件内容
.文件 .目录 都是隐藏文件
5.ls 列出目录中的内容 list
-a 显示所有文件,包括隐藏文件
-l 显示文件的详细信息
-d 只显示隐藏文件
-h 显示文件大小单位
--color=auto 按照文件的分类高亮显示文件
ls -al
# 给命令起别名
6.vim .bashrc
### 添加别名
7.alias 别名="命令 参数"
alias -a # 查看所有生效的别名
### 保存退出后,让修改生效
8.source .bashrc # 使系统的某些配置文件生效
# 取消别名(临时)
9.unalias -a #取消所有别名
shell常用快捷键
快捷方式 | 作用 |
---|---|
Tab | 自动补全命令或文件(目录)的名称 |
Ctrl+c | 结束终端中正在运行的命令 |
Ctrl+d | 从某些程序中退出 ( exit ) \quit\ q\ vim --> ESC :q! |
Ctrl+a | 移动光标到终端开头 |
Ctrl+e | 移动光标到终端结尾 |
Ctrl+l | 清屏 |
上方向键 | 找回历史命令,向上找 history |
下方向键 | 找回历史命令,向下找 |
Ctrl+s/Ctrl+q | 锁定与解锁Shell |
Ctrl+z | 将前台正在运行的服务放置到后台运行 |
文档管理命令
10.pwd 打印当前工作目录的名字 print working director
11.cd 改变/切换目录里 change directory
./ # 表示当前路径
../ # 上层路径
~ # 代表家目录
cd # 直接敲cd回到当前用户的家目录
cd .. # 进入当前目录的上一层目录 cd ../../
cd - # 返回之前的目录
cd ~ # 返回家目录
# 绝对路径:从"根"/ 开始的路径是绝对路径
# 相对路径:只要不从"根"/开始的路径都是相对路径,从当前路径开始的路径
12.mkdir 创建目录 make directory
- -p 创建多层目录
mkdir 目录名
mkdir -p 目录1/目录2 # 多层目录创建
mkdir -p 目录1/{目录2,目录3}
13.rmdir 删除空目录
14.rm -rf 强制删除目录命令
15.du 查看目录中文件大小
- -h 给大小加单位 human 方便人类查看
- -s 不显示每个文件详细大小,只显示最后结果
16.touch (抚摸) 创建新的文本文件。可以更新修改已有文件的时间。
touch test{0..10} # 创建10个空文件
17.file 文件名 查看文件类型
- (-) text (file) 脚本.程序源代码.配置文件.日志文件
- ASCII
- UTF-8 (Unicode)
- (l)link 链接文件 快速访问某些文件
- (b)block 光盘.U盘.硬盘
- (c)character 字符类型,输入输出设备
- (d)directory 目录类型的文件
- (-)executable 可执行文件(二进制文件)/usr/bin/
- (p)pipe 管道类型的文件用于程序与程序间数据传输\
- (s)socket 网络套接字,用于程序间的网络通信
18.cp
19.mv
20.rm
cp (copy) mv (move) rm(remove)
cp 目标文件 目的地 (复制,复制后,原文件不改变)
-r 递归复制,复制目录 **
-a 连带权限,时间戳也同时复制到目的地
-v 显示复制过程
mv 目标文件 目的地 (移动,移动后,原文件就不在了)
-f, --force 覆盖前不询问
-i, --interactive 覆盖前询问
-n, --no-clobber 不覆盖已存在文件
-v 显示复制过程
rm 目标文件
-r 递归删除,删目录 **
-f 强制删除,不提示 **
-i 删除时提示
# && 与操作(前一个命令正常执行成功后,在执行下一个命令) || 或操作 前一个命令不论是否成功都会执行下一个命令
mkdir -p ./log && find / -name "*.log" -exec cp {} ./log \;
Linux目录结构
#20. tree -Ld 1 / # -L 表示显示的层数 -d 只显示目录
/ # “根”目录 所有文件目录都必须挂载在“根”目录上(root)
├── bin -> usr/bin # binary 二进制的程序,所有用户都可使用的程序,是/usr/bin的一个软链接 *****
├── boot # 启动目录,存放系统内核,启动脚本 *****
├── dev # device 设备,硬件设备的映射文件,加载硬件资源 *****
├── etc # 配置文件,系统配置文件,yum安装的服务的配置文件 *****
├── home # 普通用户的家目录
├── lib -> usr/lib # library 程序依赖库,系统中程序共享的依赖库
├── lib64 -> usr/lib64 # 64位的library
├── media # 媒体文件,用于挂载光盘.U盘.移动硬盘 *****
├── mnt # 挂载临时设备 *****
├── opt # optional 可选的,安装的第三方程序。 *
├── proc # 虚拟目录,内存映射文件 *
├── root # 管理员的家目录
├── run # 临时文件系统,系统启动信息,程序运行的进程号 *
├── sbin -> usr/sbin # 管理员才能用的命令
├── srv # 程序或服务产生的一些数据 *
├── sys # 虚拟的档案系统 *
├── tmp # 用于存放临时文件的目录。所有用户都可以使用的目录。*****
├── usr # Unix System Resource 所有和系统相关的程序.服务都会安装到这里 *****
└── var # 系统服务默认的数据存放目录 *****
21.find 查找文件 (重要)
find # 查找文件
find / -name a.txt
find / -name pas*
find / -size +100M # + 大于 - 小于 什么都不加就是等于 c K M G T P Z BB
find /dev/ -type l # f(文本) d(目录) c(字符设备) (b块设备) (l链接) (p管道) (s套接字)
find / -mtime -1 # 查找一天以内修改过的文件+
# 排除 /proc /sys /tmp 之后 1小时内修改的文件 +n 多长时间以上 -n 多长时间以内
find / \( -path "/proc" -o -path "/sys" -o -path "/tmp" \) -prune -o -cmin -60
find / -perm 755 # 根据权限查找
find / -user root # 根据用户查找
find / -group root # 根据分组查询
find / -name ".log" -exec ls -l {} \; # -exec 将前查找的结构交给后一个命令进行并处理
# {}:表示find查找到的结果
# \; 表示当前的操作结束了
mkdir -p ./log && find / -name "*.log" -exec cp {} ./log \;
find . -name "*log" -type f -exec rm -rf {} \;
22.which 命令名 # 查找程序所在路径
23.whereis 命令名 # 找到命令的程序路径和帮助文档的路径
# 24.cat 显示文件中的内容
* -n 显示行号
*# stdin 标准输入 键盘输入
*# stdout 标准输出 显示器中输出的内容
*# stderr 错误输出 程序出错显示的内容
*cat << EOF >> 文件名
# 25.tac 倒叙输出
more | less 翻页显示文件
# 26.more
*直接敲q退出
*回车一行一行的翻页
*空格一页一页的翻页
# 27.less
* 前后都可以翻页 q退出
# 28.head 默认显示头10行
* -n 5 等价 -5 显示前5行
# 29.tail 默认显示后10行
* -n 5 等价 -5 显示后5行
* -f 显示文件最新追加的内容
# 30.cut 切割文件中部分内容
cat /etc/passwd | cut -f1 -d":" >user.txt
cut -f1-3 # 1-3 1到3列 1,3 1和3列
# 31.tr 替换 (默认不改变原文件)
cat f1.txt |tr "a-z" "A-Z"
# 32.wc (words counts)
-c, --bytes print the byte counts
-m, --chars print the character counts
-l, --lines print the newline counts
-w, --words 显示单词数
-L, --max-line-length 显示最长行的长度
# 33.stat 文件名 显示文件的详细信息
# stat f1.txt
文件:"f1.txt"
大小:679 块:8 IO 块:4096 普通文件
设备:803h/2051d Inode:67146754 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2019-11-15 16:46:46.298415323 +0800
最近更改:2019-11-15 16:26:08.582488675 +0800
最近改动:2019-11-15 16:26:08.582488675 +0800
创建时间:-
# 34.diff 比较两个文件是否一致,完全一致就什么都不显示
# 35.grep 查找的内容 文件路径 (awk sed grep)文本处理三剑客
grep 查找规则 文件名 # 查找所有符合规则的行
grep that ~/*.txt
ps -aux |grep "ssh" | grep -v "grep"|grep "/usr"
选项
--color=auto 将颜色高亮显示
给 grep 指令起一个别名 vi ~/.bashrc
添加一行 alias grep='grep --color=auto'
让配置文件立即生效 source ~/.bashrc
-v 取反,根据条件配备相反的内容
-c 得到内容的个数(行数)
-i 不区分大小写的查找
-n 显示在文档中的行号
-r 递归查找,但是不能限制后缀,只能遍历所有,从目录中所有文件中过滤查找
grep -r that ~/*
-l 只显示文件名,不显示内容
grep -l 你好 ~/test/*.txt
# cd /etc/httpd/conf
# cp httpd.conf httpd.conf.$(date +"%F")
# cat httpd.conf.2019-11-18 |grep -Ev "^$|#" >httpd.conf
正则表达式进行查找
\w(数字字母下划线) [a-zA-Z0-9_]
\W(除了上面) [^a-zA-Z0-9_]
\d(数字) [0-9]
\D(非数字) [^0-9]
.(除了换行符)
*(任意多个)
+(至少1个)
?(0个或者1个)
{11} # 固定数量11位
{1,5} # 匹配次数为1~5个
grep -E ".*?" demo.txt
-E 使用正则表达式来进行匹配
36.gzip
37.bzip2
38.xz
39.tar
40.unzip
# 使用网络进行上传下载.备份数据时,一般使用压缩
gzip命令.bzip2命令.xz命令
用途:制作压缩文件.解开压缩文件
格式:gzip [-9] 文件名...
bzip2 [-9] 文件名...
gzip -d .gz格式的压缩文件
bzip2 -d *.bz2格式的压缩文件
常用命令选项
-9:表示高压缩比,多在创建压缩包时用
-d:用于解开已经压缩过的文件
gzip -9 文件名 --> 文件名.gz 压缩
gzip -d 文件名.gz --> 文件名 解压缩
归档及压缩命令 —— tar
tar命令
# tar 选项 压缩后的名字 需要压缩的文件或目录
用途:制作归档文件.释放归档文件
格式:tar [选项]... 归档文件名 源文件或目录
tar [选项]... 归档文件名 [-C 目标目录]
常用命令选项
-c:创建 .tar 格式的包文件 create
-x:解开.tar格式的包文件
-v:输出详细信息 -cv -xv
-f:表示使用归档文件
-p:打包时保留原始文件及目录的权限
-t:列表查看包内的文件
--exclude: 打包时不包含的目录或文件
# tar -czvf xxx.tar.gz xxx
# tar -cjvf xxx.tar.bz2 xxx #打包并压缩
# tar -cJvf xxx.tar.xz xxx
# tar -xvf xxx.tar.bz2 -C 解压缩路径
# 备份整个系统
cd /
tar -cjpPf bakos.$(date +%F).tar.bz2 --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys --exclude=/media --exclude=/bakos.$(date +%F).tar.bz2 /
参数 | 作用 |
---|---|
-c | 创建压缩文件 |
-x | 解开压缩文件 |
-t | 查看压缩包内有哪些文件 |
-z | 用Gzip压缩或解压 |
-j | 用bzip2压缩或解压 -J 使用xz压缩或解压缩 |
-v | 显示压缩或解压的过程 |
-f | 目标文件名 |
-p | 保留原始的权限与属性 |
-P | 使用绝对路径来压缩 |
-C | 指定解压到的目录 |
41.ln 链接命令 -s 创建软链接
# 创建软链接
ln -s 原始文件 链接文件
# 删除链接文件不影响原始文件,原始文件一旦移动或失效,软链接也会失效
# 硬链接 删除原始文件对硬链接的文件没有影响,硬链接只能链接文件
ln 原始文件 链接文件
Linux重定向
stdin stdout stderr
- 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;
- 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。
通常是用文件或命令的执行结果来代替键盘作为新的输入设备,而新的输出设备通常指的就是文件。
命令符号格式 | 作用 |
---|---|
命令 < 文件 | 将指定文件作为命令的输入设备 |
命令 << 分界符 | 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串 cat << EOF |
符号 | 作用 |
---|---|
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
42 .echo 用于在屏幕上输出 printf
echo -e "\033[31;47m 输出内容 \033[0m"
# 可以输出系统变量的值
echo $LANG # 输出系统语言
echo $PATH # 输出系统中所有可执行程序路径
43.date 查看和修改日期时间
# 查看时间
date +"%F %T"
# 把时间作为文件名的一部分来创建
touch a.$(date +"%Y-%m-%d")
# 备份log日志
tar -cjvPf var_log.$(date +"%F").tar.bz2 /var/log/
# 修改时间
date -s "2009-11-15"
# 网络时间同步
yum -y install ntp ntpdate
# 根据时间授时服务器来同步时间
ntpdate ntp1.aliyun.com
44.reboot 重启命令
45.poweroff 关机 init 0
46.wget
- wget URL
47.ps
# 用于查看系统进程 PID *****
ps -aux
ps -ef
#用户 进程号 cpu利用率 内存使用率 虚拟内存 占用的固定内存 终端 运行状态 启动时间 占用CPU的时间 命令
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.5 0.2 125868 4316 ? Ss 15:23 0:02 /usr/lib/sys
root 2 0.0 0.0 0 0 ? S 15:23 0:00 [kthreadd]
root 3 0.1 0.0 0 0 ? S 15:23 0:00 [ksoftirqd/0
### 查看程序是否在运行
ps -aux |grep "程序名"
48.top cup\内存\前n条进程
- 进入top后直接敲 t .m
- t : 显示CPU占用率
- m: 显示内存的占用率
cat /proc/cpuinfo # cup详情
cat /proc/meminfo #查看内存的详情
49.kill 杀死进程
kill -9 进程号
50.free
free -h # 显示内存
# buffer 写缓冲
即写如磁盘时,先保存到磁盘缓冲区(buffer),然后再写入到磁盘。
# cache 读缓冲
即读磁盘时,数据从磁盘读出后,暂留在缓冲区(cache),为后续程序的使用做准备。
# shared 共享内存
51.cal 查看日历
52.uname 查看系统信息
- -a 完整信息
- -r 显示内核版本
53.df 查看磁盘使用率
- df -h
54.htop 加强版的top
55.last 显示登录系统的用户信息
56.uptime 系统运行时间与运行状态
57.pidof 查看正在运行的命令的进程号
58.ifconfig 查看系统的Ip地址
59.who 查看当前正在登录的用户是谁
60.w 查看目前等登录用户的详情
61.history 查看历史命令
~/.bash_history
记录历史命令
> ~/.bash_history # 清空历史命令
set +o history # 不记录历史命令
set -o history # 重新记录历史命令
62.whoami 查看当前用户的用户名
63.pkill 通过程序名杀死进程
pkill -9 程序名
64.halt 关机命令 只能由root用户使用
65.bc 简单计算器 quit 退出
66.hwclock
hwclock 显示硬件时间
-s 以硬件时间矫正系统时间
-w 以系统时间矫正硬件时间
67.shutdown
- -r 重启
- -h 关机
shutdown -r now == reboot == init 6
shutdown -h now == halt == init 0 == prowoff
68.curl 下载网页源码
69.locate 用来快速查找文件
yum -y install mlocate
updatedb # 文件系统数据库
locate passwd
70.gcc 编译C语言的编译器 命令
- gcc 源文件 -o 程序名
vim编辑器
71.vi 72.vim
-
普通命令模式:删除.复制.剪切数据.替换(默认)
-
编辑模式:输入文本,修改文本
-
末行模式:保存.退出.替换.查找.vim设置
从普通命令模式进入编辑模式
- 按i\a\o|I\A\O
- i:将光标插入到当前位置
- a:将光标插入到当前的后一位
- o:将光标移动到下一行
- I:将光标移动到行首
- A:将光标移动到行尾
- O:将光标移动上一行
从编辑模式进入到普通命令模式按ESC
从普通命令模式输入":" 进入末行命令模式
# 普通命令模式
跳转 : gg | GG
gg # 光标跳转到第一行
ngg # n为一个整数,跳转到第n行
GG # 跳转到最后一行
按行删除: dd
dd # 删除光标所在当前行
ndd # 删除包括光标所在行的n行
按行复制:yy
yy # 复制当前行
nyy # 复制n行
撤销操作: u
粘贴:p # 粘贴被dd删除的行或yy复制的行
撤销撤销:ctrl + r
# 末行命令模式
设置行号:set nu
取消行号:set nonu
保存:w | w 新文件名 #另存为其他文件
退出: q
强制退出:q!
保存退出:x
查找: /关键字 从上向下找
?关键字 从下向上找
n N
支持正则表达式
替换:
:s/原字符/新字符 光标当前行替换一次
:s/原字符/新字符/g 替换光标所在行中所有的原字符
:%s/原字符/新字符/g 替换全文的所有原字符
跨文件编辑
:e /路径/文件
读入其他文件内容
:r /路径/文件
# 让拥有sudo权限的用户保存只读文件
w !sudo tee %
# 普通使用root权限编辑文件
sudo vim
修改主机名 /etc/hostname
vim /etc/hostname
###################
#直接修改成我们需要的名字
MyLinux01
###################
# 保存退出
# 重启才会生效
hostname MyLinux01 # 临时修改主机名
73.nmtui 用于修改网卡配置
修改网卡信息 /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet # 网络类型
BOOTPROTO=static # 启动协议 none\dhcp\static
NAME=eth0 # 网卡名
DEVICE=ens33 # 设备名
ONBOOT=yes # 是否开机启动 yes
IPADDR=192.168.80.110 # IP地址设置
PREFIX=255.255.255.0 # 子网掩码
GATEWAY=192.168.80.2 # 网关
DNS1=8.8.8.8 # DNS
重启网卡
- /etc/init.d/network restart
- systemctl restart network
本地Yum源的配置 /etc/yum.repos.d/
# 加载光盘
mkdir /media/cdrom
mount /dev/sr0 /media/cdrom # 挂在光盘到系统的/media/cdrom 目录
# 修改本地Yum源
cd /etc/yum.repos.d/
## 备份原来的Yum源
mkdir bak
mv *.* bak
# 修改本地yum源
cp bak/CentOS-Media.repo ./
vim CentOS-Media.repo
###################################################
[c7-media]
name=CentOS-$releasever - Media
baseurl=file:///media/cdrom/ # 光盘挂载路径
gpgcheck=0 # 是否验证软件包 0
enabled=1 # 是否开启本yum源 1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
###################################################
yum makecache # 获取yum源的缓存
yum -y install zsh
yum与rpm命令
74.rpm
rpm 管理rpm包的命令
- -i 安装软件包
- -e 卸载软件包
- -vh 显示安装或卸载过程
- -q 查找软件包相关信息
- -qa 系统中所有已经安装的软件包的信息
- -qi 指定某个软件包的详细信息
- -ql 显示安装包的安装目录.依赖文件.帮助文档
- -qc 只显示安装目录
- -qd 安装的文档目录
- -qf 查看文件.命令属于哪个安装包
# 安装rpm软件包
rpm -ivh wget-1.14-18.el7.x86_64.rpm
# 卸载软件包
rpm -evh wget
# 更新
rpm -Uvh wget-1.14-18.el7.x86_64.rpm
75.yum
yum -y install 软件包名
- -y:同意安装,不需要在安装过程中确认。
- install : 安装
- remove : 移除已经安装上的软件
- update : 更新软件
- makecache : 产生软件包的缓存
- repolist all : 列表所有yum(源)仓库信息
- list all : 列出所有软件包名
yum list all| grep "bash"
- info : 查看软件包的信息
- clean all :清理仓库缓存
- check-update : 检测软件更新
- grouplist :显示所有组
- groupinstall :安装某个组
- groupremove:删除组
- groupinfo:查询组信息
76 .mount 挂载磁盘.U盘.光盘
-
-t : 指定挂载的文件系统类型 ext3\ext4\xfs\nfs\ ntfs\fat32 iso9660
-
-a : 挂载/etc/fstab
-
开机自动挂载光盘
vim /etc/fstab
#############################
# 设备名或设备的uuid # 挂载点 # 文件系统类型 # 挂载模式 # 备份 # 检测
/dev/cdrom /media/cdrom iso9660 ro 0 0
#############################
77.umount
umount 挂载路径
78.make
make install # 默认将生成的程序与文档拷贝到/usr/local/
用户管理类命令
三类用户:
- root 超级管理员 UID 0
- 普通用户 UID 1000以后的用户
- 程序用户 1~500 (不能登陆系统) 用于启动程序.管理进程.配置文件与数据的用户。
/etc/passwd
x:是否使用密码才能登陆
#用户名:x:uid:gid:全名:用户家目录:用户的默认shell
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
......
zj:x:1000:1000::/home/zj:/bin/bash
zz:x:1001:1001::/home/zz:/bin/bash
# 手动创建组
vim /etc/group
##########################
bbb:x:1003:
##########################
# 手动创建用户
vim /etc/passwd
##########################
bbb:x:1003:1003::/home/bbb:/bin/bash
#########################
## 创建用户家目录
mkdir /home/bbb
## 复制默认配置文件到用户家目录
cp /etc/skel/.* /home/bbb
## 将家目录的用户和组改为新用户
chown bbb.组名 -R /home/bbb
## 给新用户创建密码
passwd bbb
## 登陆新用户
su - bbb
79.useradd 添加新用户(root或拥有root权限的用户才能添加信息用户)
- -s 设置新用户shell
- -g 组id
- -G 添加附加组
- -d 设置家目录
- -e 指定账号过期时间
- -u uid
useradd 用户名 # 创建新用户
useradd -d /home/alias -s /bin/zsh -c "阿利亚" -u 10086 -e 2020-01-01 -g 10086 -G root alias
passwd alias
80.userdel
- userdel -r 用户名 # 删除用户的同时删除其家目录和邮箱
81.usermod 修改用户的信息
- id gid 过期时间 家目录 shell 注释信息
82.groupadd 添加组
groupadd 组名
- -g 修改组名
83.groupdel
84.groupmod
85.passwd (root或拥有root权限的用户才能修改用户的密码)
-
-l 锁定用户
-
u 解锁用户
- -S 查看用户的状态
- -d 清空用户密码
# 在脚本中生成密码
echo "root123" |passwd --stdin tony
86.gpasswd
87.chpasswd (批量修改密码)
88.su # su - 用户名
- su - # 切换为root用户
- su - 用户名 # 切换成普通用户
- /etc/passwd # 用户信息
- /etc/shadow # 用户密码(加密过的)
root:$6$ovSv3/FjlJR2FE8q$qoYVFWXJWTZZn1liTse09VnfxUsoohXAW9OKTRIQSwk1nPz8exYn615IxnD5mFDIqn3FIfS7fLyBUv8SFY5R1.::0:99999:7:::
# 1.用户名
# 2.加密后的密码
# 3.修改时间从 1970-1-1 天数
# 4.最短有效时间 默认为0
# 5.最长有效期 默认是99999
# 6.密码失效前提醒时间 默认7天
# 7.过期后多少天禁用用户 date "-d 1970-1-1 9999 days"
# 8.过期时间
# 9.无(备用)
89.chpasswd 批量生成密码
chpasswd < pas.txt # 体前将 用户名:密码的信息保存到文件中
#/etc/group # 组信息
# /etc/gshadow # 组密码
权限管理命令
ls -l
查看文件的权限
[root@MyLinux01 ~]# ls -l
总用量 4
-rw-r--r-- 1 root root 38 11月 22 15:45 pas.txt
drwxr-xr-x 3 root root 123 11月 22 14:06 script
# 1.文件类型与权限 Access Privilege
d rwx r-x r-x
类型 文件所属用户 文件所属组 其他用户的权限
r : read 4
w : write 2
x : execute 1
- : nono 0
s : x 在执行程序时让其他用户临时拥有所有者或所属组的权限
S : 大S 没有可执行权限时,强制给文件加s权限,表示添加失败
t : 粘滞位 给目录的权限,在本目录下不能删除其他人的文件
T : 目录其他人的权限没有x时,强行加t,表示添加失败的
567 r-x rw- rwx
654 rw- r-x r--
-w- --x r-- 214
755 -rwxr-xr-x
644 -rw-r--r--
600 -rw-------
777 -rwxrwxrwx
# 2.硬链接的次数 Links inode 节点
# 3.文件属于的用户(属主) Uid (User Name)
# 4.文件属于的用户组(属组) Gid (Group Name)
# 5.文件的大小 Size
# 6.修改时间 Modify
# 7.文件名 File
stat -c %A ppp.txt # 仅查看文件的权限
90.chmod 修改文件的权限
- 字母修改法
- u(user) g(group) o(other) a(all)
- chmod +x a.sh
- chmod u=rwx,g=rx,o=r a.sh
- 数字修改法
- chmod 666 a.sh
- 0000 ~ 7777
- 特殊权限:1 -- t 2--sgid 3-- 同时加t和sgit 4--suid
91.chown 修改文件的用户和组
- chown 用户.组 -R 文件
92.chgrp 设置文件的组
- chgrp 组名 -R 文件
权限 | 文件 | 目录 |
---|---|---|
r | 查看文件的内容 | 可以使用ls命令查看目录下的内容 |
w | 添加.修改.删除文件中的内容 | 创建.移动.复制.改名.删除文件 |
x | 执行权限 | cd 到目录的权限,进入目录 |
t | ----------------------------------------- | 防止其他用户删除非自己的文件 |
s | suid/sgid 其他用户在执行命令时,拥有属主或属组的权限 | -------------------------------------------- |
磁盘管理
93.fdisk 磁盘的分区命令
# 显示磁盘的信息
fdisk -l
# 对sdb磁盘进行分区
fdisk /dev/sdb
n # 创建新分区
p # 主分区
默认 # 分区编号
默认 # 选择扇区
+2GB # 选择分区大小
w # 保存分区信息
# 磁盘格式化命令(xfs文件系统)
mkfs.xfs /dev/sdb1
# 挂载新分区到系统/mnt目录上
mount /dev/sdb1 /mnt/
# 查看当前系统上的磁盘信息
df -h
fdisk /dev/sdb
p # 查看当前磁盘的分区状态
d # 删除分区
w # 保存
mkdir /data/{c,d,e}
vim /etc/fstab
/dev/sdb1 /data/c ext4 defaults 0 0
/dev/sdb5 /data/d ext4 defaults 0 0
/dev/sdb6 /data/e xfs defaults 0 0
94.mkfs.ext4|mkfs.xfs 格式化磁盘空间
- mkfs.ext4 /dev/sdb1
95.mkwsap 把磁盘分区格式化成交换分区
96.swapon 开启新的交换分区
97.swpaoff 关闭交换分区
系统服务管理命令
什么是守护进程?
-
daemon
-
在后台运行
- 不接受用户直接控制
- 执行特定的任务
- init network httpd crond
前台服务.后台服务
- 在终端中正在执行的程序ping
如何切换前后台服务?
进程管理命令
98.jobs 查看所有在后台被暂停的任务
- Ctrl + Z 将服务暂停在后台
99.fg n 将后台暂停的服务,拉回前台继续执行
100.bg n (backstage) 将后台暂定的服务在后台继续运行
在命令执行的最后面加 & 让程序在后台继续执行
系统的启动流程?
- 1.开机自检,BIOS, 在主板上的ROM芯片上存储
- 2.加载MBR \ UEFI
- 3.GRUB2 引导菜单
- 4.加载内核
- 5.启动init ( 初始化)0 ~ 6
- 0 关机
- 1 无网络的单用户模式(root)
- 2 无网络的多用户模式
- 3 有网络的多用户模式
- 4 (无)保留模式
- 5 GUI有网络多用户模式
- 6 重启模式
- 6.启动内核模块
- 7.启动不同级别的脚本
- 8.启动成功 (sshd)
101.systemclt 启动.关闭.重启.各种后台服务 查看 服务状态 ,设置开机自启动
- systemclt start 服务名.service 启动服务
- systemclt stop 服务名.service 关闭服务
- systemclt restart 服务名.service 重启服务
- systemclt status 服务名.service 查看服务状态
- systemclt enable 服务名.service 开机自启动服务
- systemclt disable 服务名.service 开机不启动
- systemclt reload 服务名.service 重载服务(重新加载服务配置文件)
- systemctl list-unit-files --type=service 查看各个级别的启动与禁用情况
定时任务
102.at 只执行一次的定时任务(了解)
yum -y install at
systemctl restart atd
systemctl enable atd
at HH:MM yyyy-mm-dd
at 16:20 2019-11-27
>reboot
Ctrl + d
103.atq 查看当前未执行的的任务列表
[root@Base ~]# atq
编号
2 Tue Nov 26 16:25:00 2019 a root
104.atrm 编号 根据编号删除 定时任务
105.crontab (crond)
- -l 查看设置成功的定时任务 等价 cat /var/spool/cron/root
- -e 添加或编辑定时任务 等价 vim /var/spool/cron/root
- -u 指定用户添加或删除定时任务 rm /var/spool/cron/root
- -r 删除定时任务
定时任务 时间设置
分钟 小时 日期 月份 周 命令
0~59 0~23 1~31 1~12 1~7(0也表示周日)
* * * * *
30 3 * * * /bin/tar -cjvf /root/etc.tar.bz2 /etc
*/5 * * * *
0 8-18/2 * * * /bin/tar -cjvf /root/mysql_data${date +"%F"}.tar.bz2 /var/lib/mysql
0 5 * * * /bin/bash /root/bak_data.sh
* 表示任意时间
, 1,15 表示不连续的时间
- 连续的时间进行的任务
/ 指定间隔的频率
SSH (安全的远程登录协议)
- 使用非对称加密方式对数据加密
- 对称加密(加密和解密使用同一个秘钥)中间人攻击
- 非对称加密方式,公钥(只能加密)和私钥(只能解密)
访问端a <----> 服务端b
公钥a
公钥b
106.ssh 用于远程连接的命令
- ssh 用户名@ip地址:22
免密码登录的原理:
- 1.给服务端发送一个随机字符串
- 2.服务端把这个随机字符串使用访问端的公钥加密后再发送给访问端
- 3.访问端私钥解密后将两个字符串进行比对,成功后运行登录。
107.ssh-keygen 生成公钥私钥对。
108.ssh-copy-id 将公钥复制到对方服务器的authorized_keys中
109.scp 用于跨服务器复制数据
- -r 复制目录
scp -r /etc root@192.168.80.133:/tmp
scp -r root@192.168.80.111:/var/log ~/
(lrzsz)
rz # 文件的上传
sz # 文件的下载
sftp # 安全的文件传输协议
- 服务端主程序:/usr/sbin/sshd 默认端口22
- 客户端主程序:/usr/bin/ssh
- 服务端配置文件:/etc/ssh/sshd_config
- 客户端配置文件:/etc/ssh/ssh_config
# etc/ssh/sshd_config
PermitRootLogin yes # 是否直接让root用户登录系统
110.setenforce 0 # 临时关闭selinux
[root@Base ~]# vim /etc/selinux/config
```
SELINUX=disabled
```
[root@Base ~]# setenforce 0
[root@Base ~]# systemctl
[root@Base ~]# systemctl stop firewalld
[root@Base ~]# systemctl disable firewalld
hostnamectl set-hostname server-112
# 修改主机名(永久生效)
21 ftp
22 ssh sftp
80 http
443 https
137\138\139\445 samba
3306 mysql
9000 php
8080 tomcat
文本处理命令
111.sed 行编辑命令
- sed 参数 规则 文件路径/文件名
- -n 不显示文件的全部内容,一般用于查看,不修改源文件,和p规则一起使用。
- -i 用于直接修改原文件
- -e 可以实现过个规则的交集 sed -ne "s#bin#NNN#g" -ne "2p" /etc/passwd
- 规则:
- p print 打印查找的数据
- g global 全局
- s 替换
- d 删除 “1d” 删除第一行 ‘’ sed -e '/#/d' -e '/^$/d' httpd.conf
- a 在第n行之后添加 sed "na123" httpd.conf
- i 在第n行插入 sed "ni123" httpd.conf
112.awk 编辑神器
- awk 参数 规则 路径/文件
- -F 指定分割符
- 规则 '{ print $10 }' $0 表示所有列,$1 ~ $n 列号
Samba 服务
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。
SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
# 安装服务
yum -y install samba samba-client
# 启动服务
systemctl start smb nmb
# 新建一个用户,用于文件共享
useradd -s /sbin/nologin test
# 创建smb共享密码
smbpasswd -a test
# 设置访问权限
chmod -R 755 /home/test/
# 修改配置文件
vim /etc/samba/smb.conf
#配置文件类似如下
[test] # 共享名
comment = "samba test" # 描述信息
path = /home/test # 共享目录
browseable = yes # 所有人可见
public = yes # 是否公开
writable = yes # 是否允许修改
# 重启服务
systemctl start smb nmb
[global]
workgroup = MYGROUP #工作组名称
server string = Samba Server Version %v #服务器描述
#netbios名称
; netbios name = MYSERVER
#设置允许侦听的本地网络接口
; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
#指定允许连接samba服务器的网段和IP
; hosts allow = 127. 192.168.12. 192.168.13.
#禁止对应网段的访问,这些也可以单独设置在共享中
hosts deny = 192.168.80.20
# --------------------------- Logging Options ---------------
#日志存放路径
log file = /var/log/samba/log.%m
#每个日志文件的最大容量
max log size = 50
# ----------------------- Standalone ServerOptions-----------------
#安全级别分五种:
#share: 共享级别,服务器不对客户机进行身份验证,不推荐使用。
#user: 用户级别,服务器对客户机进行身份验证,默认使用这个。
#server: 服务器级别,Samba服务器必须通过另一台服务器对客户机进行身份验证。如果设置为此值,需另加一行:password Server = IP才行。
#domain: 域级别,Samba服务器要通过windows server的域控制器对客户机进行身份验证,需另加一行:password Server = IP才行。
security = user
#指定Samba服务器对用户帐户和密码的管理方式。一般默认即可,不推荐使用smbpasswd文件保存密码。
passdb backend = tdbsam
#============================ Share Definitions===================
#这里定义的是家目录的共享,共享是的文件夹名称为用户名
[homes]
comment = Home Directories #注释信息
browseable = no #文件夹是否可以被其它用户浏览
writable = yes #用户是否可以写入
; valid users = %S #设置允许访问的用户
#允许访问的域用户,%S是一个samba变量,代表当前服务器名
#%u代表当前服务器的用户
; valid users = MYDOMAIN\%S
#打印共享
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes
#常用选项
comment = 备注信息
path = 绝对路径
public = yes/on 是否允许显示给所有人
valid users = 用户名/@用户组 设置允许访问的用户或用户组,默认为yes。
readonly = yes/on 是否为只读
writable = yes/on 是否允许读写
write list = 用户/@用户组 允许读写的用户名单
guest ok = yes/on 是否允许匿名访问
guest only = 只允许匿名访问
creat mask = 权限掩码
directory mask = 目录掩码
常见通配符
%S = 当前服务名(如果有的话)
%P = 当前服务的根目录(如果有的话)
%u = 当前服务的用户名(如果有的话)
%g = 当前用户说在的主工作组
%U = 当前对话的用户名
%G = 当前对话的用户的主工作组
%H = 当前服务的用户的Home目录
%v = Samba服务的版本号。
%h = 运行Samba服务机器的主机名
%m = 客户机的NETBIOS名称
%L = 服务器的NETBIOS名称
%M = 客户机的主机名
%N = NIS服务器名
%p = NIS服务的Home目录
%R = 说采用的协议等级(值可以是CORE, COREPLUS, LANMAN1, LANMAN2,NT1)
%d = 当前服务进程的ID
%a = 客户机的结构(只能识别几项:Samba,WfWg,WinNT,Win95)
%I = 客户机的IP
%T = 当前日期和时间
DNS服务
域名解析服务
- 正向解析:输入域名返回返回IP地址
- 反向解析:输入IP地址返回域名
需要安装软件包: bind
服务名称: named
yum -y install bind*
systemctl restart named
systemctl enable named
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
# 查看named的主配置文件
vim /etc/named.conf
###############################################
listen-on port 53 { any; }; # 绑定的地址需要修改
allow-query { any; }; # 允许查询的服务地址
##############################################
www.rtkj.com 192.168.80.22 mail.rtkj.com 192.168.80.33 dns.rtkj.com 192.168.80.133 ftp.rtkj.com 192.168.80.122 new.rtkj.com 192.168.80.101
# 确定“域”名 --> rtkj.com
# /etc/named.conf 或 /etc/named.rfc1912.zones
vim /etc/named.rfc1912.zones # 辅助域配置文件
#######################################################
# 定义正向解析域
zone "rtkj.com" IN {
type master;
file "rtkj.com.zone"; # 正向解析是设定好域名,通过域名从正向解析文件中找响应的IP地址。
allow-update { none; };
};
# 定义反向解析域
zone "80.168.192.in-addr.arpa" IN {
type master;
file "80.168.192.zone"; # 设定好ip的网络段,通过ip找域名
allow-update { none; };
};
#######################################################
# 到/var/named 下创建并修改zone文件
cd /var/named/
touch rtkj.com.zone 80.168.192.zone
vim rtkj.com.zone
:r ./named.localhost
############################################################################
$TTL 1D
@ IN SOA rtkj.com. root.rtkj.com. (
133 ; serial 版本号
1D ; refresh 更新时间
1H ; retry 重试时间
1W ; expire 终止时间
3H ) ; minimum 默认DNS缓存时间
IN NS dns.rtkj.com.
IN MX 10 mail.rtkj.com.
www IN A 192.168.80.22
mail IN A 192.168.80.33
dns IN A 192.168.80.133
ftp IN A 192.168.80.122
new IN A 192.168.80.101
##############################################################################
vim 80.168.192.zone
:r ./named.loopback
#######################################################################################
$TTL 1D
@ IN SOA rtkj.com. root.rtkj.com. (
133 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.rtkj.com.
22 PTR www.rtkj.com.
33 PTR mail.rtkj.com.
133 PTR dns.rtkj.com.
122 PTR ftp.rtkj.com.
101 PTR new.rtkj.com.
#################################################################################
- A记录 A(Address)记录是用来指定域名对应的IP地址记录。
- NS记录 NS(Name Server)记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。
- MX记录 MX(Mail Exchanger)记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。
- CNAME记录 CNAME(Canonical Name )别名记录,允许您将多个名字映射到同一台计算机。通常用于同时提供WWW和MAIL服务的计算机。
- PTR值 PTR是pointer的简写,用于将一个IP地址映射到对应的域名,也可以看成是A记录的反向,IP地址的反向解析。
sed 行处理文本工具
ss 网络服务与端口查看命令
- lntup 查看所有tcp\udp连接服务运行情况
LAMP 环境搭建
Linux 操作系统
Apache Web服务器
Mysql or Mariadb or (MongoDB)
PHP or Python or Perl
LAMP是目前使用最为广泛的一种动态网站的搭建方式。
yum搭建lamp
# 0.准备好系统,关闭防火墙和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
######
# 配置本地yum源省略
######
# 1.安装常用软件和lamp环境
yum -y install vim lrzsz wget tree net-tools
yum -y install httpd mod_ssl php* mariadb-server
# 2.测试php环境
cd /var/www/html/
touch index.php
vim index.php
#####################
<?php
phpinfo();
?>
#######################
systemctl restart httpd
# 3.初始化mariadb
systemctl restart mariadb
# 执行初始化命令
mysql_secure_installation
# 设置mysql的root的密码
# 删除临时用户.测试库.不允许远程登录都是Y
mysql -uroot -p
/s;查看数据库状态
/q;退出数据库
# 4.将php源代复制
unzip ZenTaoPMS.11.6.5.zip
bash zentaopms/bin/init.sh
cp -r zentaopms/* /var/www/html/
###################################
# 5.访问
http://192.168.80.134/www/
# 6.增加依赖
yum -y install php-mbstring
# 0.更换yum原
yum -y install epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# 1.安装php
yum install php7*
shell脚本基础
- shell 是Unix/Linux命令解释器程序。
- 脚本是可以被解释器执行的源代码。
- 大多数linux默认的shell使用bash解释器。
创建Shell脚本
- 创建一个空的文本文件。建议.sh结尾;
- 文本当中第一行 #!/bin/bash ,确定脚本的解释器;
- 除第一行外#表示注释;
运行脚本
- bash 脚本
- chmod +x 脚本
- ./脚本
- 脚本的绝对路径
变量
-
什么是变量?
-
内存中的一个存储空间的别名。
- 可以用于存放临时数据。
-
可以变量赋值数据,可以在需要的时候从变量中直接取数据。
-
创建变量?
-
起变量名
- 不能和命令(关键字)冲突
- 数字.字母.下划线组成
- 不能以数字开头
-
变量的赋值
- $变量 一般用于取值或变量叠加
- 在赋值等于号的左右都不能有空格
- 将命令的执行结果赋值给变量可以用反引号或者$(命令)
#!/bin/bash
# Author: ZuoJie
# Time: 2019-12-6
# Desc: 用于Shell脚本的基础学习
# Version: 1.0
#code="hello world"
#code=$code" 1234"
datetime=$(date +%T)
memory=$(free -m | awk '{if(NR==2) print $3/$2*100"%"}')
echo -e "\033[32m$datetime\033[0m"
echo "内存使用率:"$memory
环境变量
- 存储系统环境中数据的变量,可以修改它的值。
- PATH : 可执行程序(命令)的的目录路径
- LANG: 当前shell环境中的默认语言
- PS1:shell终端的提示符
- PWD:当前路径
查看与修改系统环境变量
- set 查看当前shell中的所有变量
- env 环境变量
- 系统环境变量使用大写字母命名
- 修改系统环境变量
- export PATH=/root/script/:$PATH # 在当前shell和当前shell的子shell中有效。
- /etc/profile # 环境变量修改对所有用户生效
- /etc/bashrc # 对所有使用bash的用户生效
- ~/.bash_profile
- ~/.bashrc
- source .bash_profile 或 . .bash_prifile # 重载配置文件
- unset 用户删除变量
特殊变量
- 位置参数变量 : 向脚本中传递参数
- $0~$9 ${10} 用于在执行脚本值,接收外部传递进来的参数
- $ | $@ 用于接收所有的参数(参数数组),"$" 将所有参数作为一个整体 "$@"将所有参数分散获取
- $# 用于存放参数的个数
- 预定义变量
- $? 上一个命令执行的结果是否正确,正确执行返回值为0,执行错误返回非0
- $$ PID 当前脚本
- $! 最后一个在后台运行的程序的PID
- 单引号 引起来的变量:显示内容本身
- 双引号 引起来的变量:显示变量的值
键盘接收数据
read 参数 变量名
- 参数
- -p 提示信息
- -s 隐藏字符
- -t 输入超时时间
- -n 允许输入的字符个数
修改变量的类型
declare
- -i 将变量变为整数类型
- -x 将变量设置为系统环境变量
- -p 显示变量类型
条件判断
1.判断的格式
# 判断的简化写法
# [ 判断参数 文件/目录/数值/字符串/命令执行的结果 ] && 判断为真时,执行 || 判断结果为假时执行。
[ -d /abcd ] && echo "目录存在" || mkdir /abcd
# 判断的完整写法
if [ 判断条件表达式 ];then
判断为真时,执行的命令
else
判断为假时,执行的命令
fi
#!/bin/bash
read -p "请输入一个路径:" mypath
if [ -d $mypath ];then
echo "$mypath目录存在"
else
echo "$mypath目录,正在创建...."
mkdir -p $mypath
[ -d $mypath ] && echo "$mypath目录创建成功" || echo "$mypath目录创建失败"
fi
比较参数
test check file types and compare values (检测文件类型和比较值) 与 [ ] 完全等价
参数 | 功能 |
---|---|
! | EXPRESSION is false 取反,将真的结果变成假的,假的变真的 |
-a | both EXPRESSION1 and EXPRESSION2 are true(两个表达式同时为真时,结果为真) |
-o | either EXPRESSION1 or EXPRESSION2 is true (任意一个表达式为真,结果为真) |
-n | the length of STRING is nonzero (字符串长度不为空时,结果为真) |
-z | the length of STRING is zero (字符串为空的时候,结果为真) |
== | the strings are equal (两个字符串比较相等时,值为真) |
!= | the strings are not equal (两个字符串比较不相等时,值为真) |
-eq | INTEGER1 is equal to INTEGER2 (两个整数相等时,结果为真) |
-ne | INTEGER1 is not equal to INTEGER2 (两个整数不相等时,结果为真) |
-ge | >= INTEGER1 is greater than or equal to INTEGER2 |
-gt | > INTEGER1 is greater than INTEGER2 |
-le | <= INTEGER1 is less than or equal to INTEGER2 |
-lt | <INTEGER1 is less than INTEGER2 |
-ef | FILE1 and FILE2 have the same device and inode numbers (两个是否是同一个文件,互为硬链接) |
-nt | FILE1 is newer (modification date) than FILE2 (文件1比文件2新) |
-ot | FILE1 is older than FILE2 ( 文件1比文件2旧时为真) |
-b | FILE exists and is block special (文件存在,并且是块文件) |
-c | FILE exists and is character special (文件存在,并且是字符文件) |
-d | FILE exists and is a directory (文件存在,并且是目录) |
-e | FILE exists (文件只要存在,结果为真) |
-f | FILE exists and is a regular file ( 普通文件) |
-g | FILE exists and is set-group-ID ( rwxrws--- ) |
-G | FILE exists and is owned by the effective group ID |
-h | FILE exists and is a symbolic link (same as -L) |
-k | FILE exists and has its sticky bit set (drwxrwxrwt) |
-L | FILE exists and is a symbolic link (same as -h) 软链接文件 |
-O | FILE exists and is owned by the effective user ID |
-p | FILE exists and is a named pipe 管道文件 |
-r | FILE exists and read permission is granted 读权限(普通用户) |
-s | FILE exists and has a size greater than zero 空文件为真 |
-S | FILE exists and is a socket 是否是网络套接字 |
-t | file descriptor FD is opened on a terminal 在终端上打开文件描述符FD |
-u | FILE exists and its set-user-ID bit is set |
-w | FILE exists and write permission is granted 判断写权限 |
-x | FILE exists and execute (or search) permission is granted 判断执行权限 |
# 修改数据库root密码
old_password="admin"
new_password="123456"
mysql -uroot -p$old_password <<EOF
UPDATE mysql.user SET Password=PASSWORD("$new_password") WHERE User="root";
FLUSH PRIVILEGES;
EOF
case 分支结构
case $变量 in
值1)
变量等于值1时执行代码
;;
值2)
变量等于值2时执行代码
;;
# 省略......
*)
执行代码
;;
esac
循环
# for的第一种写法(循环数组内容或命令结果)
for 变量 in 一组数据;do # 1 2 3 4 5 6
echo $变量 # 通过$变量可以按顺序重一组数据中依次取数据
done
# for的第二中写法(有明确的循环次数)
for ((i=0;i<10;i++));do
echo $i
done
# while 循环 (没有明确的循环次数时,使用while)
while [ 条件表达式 ];do
需要重复执行的代码
done
# until 循环 条件为假时,循环
until [ 条件表达式 ];do
需要重复执行的代码
done
# exit 退出脚本
# break 退出循环
# continue 退出当前循环,继续下次循环
转义字符
转义字符 | 含义 |
---|---|
\n | 换行 |
\t | 水平制表符(tab) |
\r | 回车 |
\\ | 反斜杠\ |
\" | " |
\' | ' |
交互简单方法
# 使用输入重定向在脚本内部创新的分区
fdisk /dev/sdb <<EOF
n
p
+10G
w
q
EOF
数组
- 一组数据
- 数组中的每个数据(元素)会有编号,索引或者下标(index)
- 普通数组 :一组有顺序的数据。从零开始的数字作为下标。
- 关联数组:使用字符串作为下标。
# 创建数组
# 给数组一个个元素的赋值
arr1[0]="A"
arr1[1]="B"
arr1[2]="C"
# 一次给数组赋多个值
arr2=( "apple" "banana" "orange" )
arr3=(`ls /`)
echo ${arr1[*]} # 获取数组中所有的数据
echo ${arr1[0]} # 通过下标获取某一个值
echo ${!arr1[@]} # 只获取数组的索引下标
echo ${#arr1[@]} # 获取数组中元素的个数
echo ${arr1[@]:开始下标:数量} # 部分获取(切片)
#!/bin/bash
# 将输入信息存入到数组中
for((i=0;i<3;i++));do
read -p "请输入学生姓名:" n
name[$i]=$n
read -p "请输入学生年龄:" a
age[$i]=$a
read -p "请输入学生性别:" s
sex[$i]=$s
done
while true;do
read -p "请输入您要查询的学生姓名:" n2
[ $n2 == "Q" ] && break
for((i=0;i<3;i++));do
if [ $n2 == ${name[$i]} ];then
echo ${name[$i]}":"${age[$i]}":"${sex[$i]}
fi
done
done
关联数组
declare -A 数组名
数组名[索引名]=值
数组名=([索引名1]=值1 [索引名2]=值2 ...)
函数
预先定义好的一个代码段。需要起个名字,叫做函数名。(不能和已有命令冲突)
通过函数名来执行代码。
# 定义函数方法一
function 函数名(){
需要被执行的代码或命令。
}
# 定义函数方法二
函数名(){
需要被执行的代码或命令。
}
# 调用执行函数
函数名 参数1 参数2
# 案例比大小
function Gt(){
# shell 中的位置参数,根据函数外部传入的顺序来获取值
if [ $1 -gt $2 ];then
echo $1"大"
# 返回状态码,省略return 默认返回0
return 0
else
echo $2"大"
return 1
fi
}
Gt 12 3
符号 | 功能 |
---|---|
. | 1. 当前目录 2.正则中表示任意字符 3. ./用于执行当前目录下的脚本或程序 4.隐藏文件以.开头 |
; | 1.在同一行执行多个命令时使用 ls ; date ; cal |
.. | 1.上层目录 |
- | 1.短参数 2. 之前的工作目录 |
-- | 1.长参数 |
~ | 1.用户家目录 |
$ | 1.获取参数的值 2.也表示普通用户 |
$? | 1.判断上一个命令执行的结果 |
$1~$9 | 1.特殊参数(位置参数 $1~$9 ${10} ) |
$# | 1.参数的个数 |
$* | 1.获取所有参数 |
$@ | 1.获取所有参数 |
$! | 1.在后台执行的命令的pid |
$$ | 1.当前shell的pid |
! | 1.取非 |
@ | 1.用户名@主机地址 |
# | 1.shell中的注释 2.root 用户 |
% | 1.字符串格式化 %s 字符串 %d 整数 %f 小数(浮点数) 2. 求余数 |
^ | 1.正则中用于匹配开头 2.[^] 取反 |
& | 1. 指令1 && 指令2 && 指令3 当之前所有的指令都成功执行时(返回结果为0) |
* | 1. shell中表示统配符 用于匹配任意长度的任意字符 2. 正则表达式中表示匹配 3. 乘法 |
() | 1.计算时的优先级最高,优先计算小括号中的指令 2. ( 指令 )会默认在当前shell的子shell中执行。 |
$() | 1.获取命令执行的结果 |
+ | 1.加法 2.某些参数 3.正则中用于匹配数量1到无数次 |
[] | 1. 条件判断 2.[a-z] 范围匹配 |
$[] $(()) | 1.数值计算不能计算小数 |
\ | 1.转义字符 \n \r \t \v |
/ | 1.根 2.路径的分割符 |
? | 1.统配符中表示1个任意字符 2.正则表达式中表示 数量0/1 数量后表示非贪婪模式 |
{} | 1.正则中 {n,m} 数量n~m个 2.函数的的范围 3.${array[0]} 数组取值 4.${变量} 获取遍历 |
: | 1.vim进入末行模式 |
| | 1.管道符 将前一个命令的执行结果交给后一个命令接着执行 |
|| | 1. 或操作 2.前一个命令执行错误时,才执行 |
’ ‘ 单引号 | 1.赋值变量时,数据中间有空格时使用 |
" " 双引号 | 1.与单引号不同的是“$变量”会获取变量的值 |
< | 1.输入重定向 命令 < 文件 |
<< | 1. 键盘输入的 数据交给命令执行 命令 << EOF |
> | 1.命令 > 文件 输出重定向 |
>> | 1.命令 >> 文件 覆盖输出重定向 |
1 > | 1. 将正确的内容输出 |
2 > | 1.将错误内容输出 |
&> | 1.全输出 |
` 反引号 | 1.获取命令 的执行结果 |
|
= | 1.用于赋值 2.用于比较 |
函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。
函数定义
Shell 函数的定义格式如下:
function function_name () { list of commands [ return value ] } 其中function关键字是可选的。
#!/bin/bash
hello(){
echo 'hello';
}
hello
运行结果:
hello
调用函数只需要给出函数名,不需要加括号。
函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。
Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:numeric argument required。
#!/bin/bash
function hello(){
return 'hello';
}
hello
运行结果:
line 4: return: hello: numeric argument required
如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。
#!/bin/bash
function hello(){
return 'hello';
}
str=hello
echo $str
运行结果:
hello
像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,如下所示:
$unset .f function_name
如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。
函数参数 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…这就是前面讲的特殊变量。
#!/bin/bash
function sum(){
case $# in
0) echo "no param";;
1) echo $1;;
2) echo `expr $1 + $2`;;
3) echo `expr $1 + $2 + $3`;;
*) echo "$# params! It's too much!";;
esac
}
sum 1 3 5 6
运行结果:
4 params! It's too much!
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
另外,还有几个特殊变量用来处理参数,前面已经提到:
特殊变量 说明 $# 传递给函数的参数个数。 $ 显示所有传递给函数的参数。 $@ 与$相同,但是略有区别,请查看Shell特殊变量。 $? 函数的返回值。