swap可以先不分,等安装后挂载文件夹作swap
文件系统 | ||
---|---|---|
/ufi | 1024MiB | ext4 |
swap | 实际内存的1~2倍 | swap |
home | 剩余存储 | ext4 |
swap可以存放内存中不常访问的数据
创建swap分区文件
fallocate -l 16GB /swapfile #或 dd if=/dev/zero of=/swap bs=1MB count=8192 mkswap -L swap /swapfile #格式化文件 swappon /swapfile #挂载交换分区 free -h #查看 vim /etc/fstab #添加 #/swapfile swap swap defaults 0 0 #以便开机自动挂载
删除交换文件分区
swapoff /swapfile rm /swapfile
/etc/share/applications/
~/.local/share/applications/
#应用快捷方式
sudo vim ~/.bashrc #修改环境变量
source ~/.bashrc #使环境变量立即生效
#环境变量例子
#jdk
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_60 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
#若有网络,使用apt install default-jdk,不需要配置环境变量
用法:uname [选项]...
输出一组系统信息。如果不跟随选项,则视为只附加 -s 选项。
-a, --all 以如下次序输出所有信息。其中若 -p 和
-i 的探测结果不可知则被省略:
-s, --kernel-name 输出内核名称
-n, --nodename 输出网络节点上的主机名
-r, --kernel-release 输出内核发行号
-v, --kernel-version 输出内核版本
-m, --machine 输出主机的硬件架构名称
-p, --processor 输出处理器类型(不可移植)
-i, --hardware-platform 输出硬件平台或(不可移植)
-o, --operating-system 输出操作系统名称
--help 显示此帮助信息并退出
--version 显示版本信息并退出
neofetch
#需要先执行sudo apt install neofetch
sudo dpkg-reconfigure console-setup
若设置中出现乱码可尝试更改/etc/default/locale
文件为
# File generated by update-locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
使用默认的的UTF-8
即可
Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器
主要作用:删除、复制、粘贴、移动光标
语法 | 功能描述 |
---|---|
yy | 复制光标当前一行 |
yaw | Yank All Words 复制整个单词 |
yf字母 | 复制光标到该字母的内容 |
y数字y | 复制一段(从光标当前行到后n行) |
y数字j | 复制一段(从光标行(1)开始计算到下n行) |
y$ | 复制该行光标到结尾的内容 |
y^ | 复制该行光标到开头的内容 |
p | 箭头移动到目的行粘贴 |
u | 撤销上一步 |
dd | 剪切光标当前行 |
daw | |
df字母 | |
d数字d | 剪切光标(含)后多少行 |
d4j | |
d$ | 剪切该行光标前的内容 |
d^ | 剪切该行光标后的内容(包括该光标) |
x | 剪切一个字符(当前光标),相当于del |
X | 剪切一个字符(当前光标的前一个),相当与Backspace |
r | 替换当前字符 |
R | 替换模式,类似insert模式 |
yw | 复制一个词 |
dw | 剪切当前词 光标在第一个字母则为当前词 其它位置则为后一个词 |
shift+6(^) | 移动到行头 |
shift+4($) | 移动到行头 |
ctrl+U | 向上翻页=PgUp |
ctrl+D | 向下翻页=PgDn |
f字母 | 移动光标到本行下一个该字母的位置 |
w | 移动到当前词头;若已经到词头,则移动到下一个词(词头位置) |
b | 移动到当前词头;若已经到词头,则移动到上一个词(词头位置) |
e | 移动到当前词尾;若已经到词尾,则移动至下一个词(词尾位置) |
H或gg | 移动到页头 |
数字+G | 移动到第几行行头 |
G或L | 移动到页尾行头 |
数字N+G | 移动到目标行 |
k | 光标上移=方向键上 |
4k | 光标上移4行 |
j | 光标下移=方向键下 |
l | 光标右移=方向键右 |
h | 光标左移=方向键左 |
主要作用:编辑文本
进入编辑模式按键 | 功能 |
---|---|
i | 当前光标前 |
a | 当前光标后 |
o | 当前光标行下插入一行 |
I | 光标所在行最前 |
A | 光标所在行在后 |
O | 当前光标行的上一行 |
cc | 删除当前一行并进入输入模式 |
c4j | |
caw | |
cf字母 |
退出
ESC
主要作用:查找、替换、退出、保存
命令 | 功能 |
---|---|
:set nu | 显示行号 |
:set nonu | 关闭行号 |
:w | 保存 |
:q | 退出 |
:q! | 不保存强制退出 |
:wq | 保存并退出 |
:wq! | 强制保存并强制退出 |
/查找的词 | n下一个,N上一个 |
:noh | 取消高亮显示 |
/旧的关键词 /新的关键词 [/g] | 替换 |
/old /new | 替换当前行匹配到的第一个old为new |
/old /new /g | 替换当前行匹配的所有old为new |
:%s /old /new | 替换文档中每一行匹配到的第一个old为new |
:%s /old /new /g | 替换文档中匹配到的所有old为new |
这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。Vim的"文本对象"也能和移动命令一样用在这个模式中
vjjjjc
#选中当前行光标后到下四行并删除且进入编辑模式
vim ~/.viminfo
ping ... #检查与...连通性
ip a #查看当前ip地址
ifconfig #查看当前ip地址,可能还需要“apt install net-tools”
#修改ip
#ubuntu17.10之前
vim /etc/network/interfaces
#Ubuntu17.10之后
vim /etc/netplan/01-network-manager-all.yaml
#还没学会【doge】
#修改主机名
#查看主机名
hostname
hostnamectl #更详细
#修改主机名
hostnamectl set-hostname 名字 #实时生效
vim /etc/hostname #重启后生效
#设置主机名与ip的映射关系
#这样相互连接时可以直接用主机名
#ubuntu
vim /etc/hosts
#windows
Windows\System32\drivers\etc
#远程登陆
#下载
sudo apt install ssh
#查询ssh状况
sudo systemctl status ssh
#连接
ssh user@remote -p port
#生成密钥
ssh-keygen
#公钥在 ~/.ssh/id_rsa.pub
#私钥在 ~/.ssh/id_rsa
#将公钥传送到远程主机host上
ssh-copy-id user@host
#或者将公钥追加在 ~/.ssh/authorized_keys末尾
#公钥上传成功后可以免密码登陆
ssh user@ip
#基于ssh的软件
#Xshell、SSHSecure Shell、SecureCRT、FinalShell等远程桌面
#Xftp、winscp、filezilla等远程传输工具
计算机中,一个正在执行的程序或命令,被叫做“进程”(process)。
启动之后一直存在、常驻内存的进程,一般被叫做“服务”(service)。
systemctl start|stop|restart|status|disable(禁用) 服务名
#在/usr/lib/systrmd/system
systemctl restart NetworkManager
#NetworkManager是network的新版本
查看默认级别:vi /etc/inittab
linux系统有7中运行级别(runlevel):常用的是级别3和5
运行级别简化为:
multi-user.target 等价于原运行级别3(多用户有网,无图形界面)
graphical.target 等价于原运行级别5(多用户有网,有图形界面)
查看当前运行级别:
systemctl get-default
修改当前运行级别:
systemctl set-default TARGET.target
#这里TARGET取multi-user或者graphical
init 6 #重启
init 5 #开启GUI
init 3 #关闭GUI
init 0 #关机
#需要root权限
#开机启动
#查看所有开机启动
systemctl list-unit-files
systemctl disable|enable|static 服务名
#disable关闭开机自启动
#enable关闭开机自启动
#static未配置
#防火墙
systemctl status|start|resart|stop ufw #查看|开启|重启|停止防火墙运行状态
sudo ufw Commands #防火墙相关
Commands:
enable #打开开机自启动防火墙
disable #禁用开机自启动防火墙
default ARG #设置默认策略
logging LEVEL #将日志记录设置为LEVEL
allow ARGS #添加允许规则
deny ARGS #添加deny规则
reject ARGS #添加reject规则
limit ARGS #添加限制规则
delete RULE|NUM #删除规则
insert NUM RULE #在NUM处插入规则
prepend RULE #prepend RULE
route RULE #add route RULE
route delete RULE|NUM #delete route RULE
route insert NUM RULE #insert route RULE at NUM
reload #reload firewall
reset #reset firewall
status #show firewall status
status numbered #show firewall status as numbered list of RULES
status verbose #show verbose firewall status
show ARG #show firewall report
version #display version information
Application profile commands:
app list list application profiles
app info PROFILE show information on PROFILE
app update PROFILE update PROFILE
app default ARG set default application policy
功能描述 | |
---|---|
sync | 将数据由内存同步到硬盘中;建议在每次保存文件后都执行一次 |
halt | 停机,关闭系统,但不断电 |
poweroff | 关机,断电 |
reboot | 重启=shutdown -r now |
shutdown [num] | 在指定时间关机; shutdown 1,一分钟后关机;缺省值为5分钟 shutdown 13:00,在13:00关机 |
shutdown -r num | 在num分钟后重启 |
shutdown -H num | 在num分钟后停机 |
shutdown -c | 停止之前的shutdown计划 |
type 命令
#判断命令是否为系统内置命令
#非系统内置,则会输出命令地址
help 命令
#获得shell内置命令的帮助信息
ls --help #命令 --help
#获得改命令内置的帮助信息
mannal
man [-k|-f|-k|-l|-w|-W] 命令或配置文件
#获得帮助信息;不能直接查询内置命令
# -k [apropos选项]正则表达式
# -f [man选项][章节]关键词
# -k [whatis选项]页
# -l [man选项]文件
# -w|-W [man选项]page
信息 | 功能 |
---|---|
NAME | 命令的名称和单行描述 |
SYNOPSIS | 怎样使用命令 |
DESCRIPTION | 命令功能的深入探讨 |
EXAMPLES | 怎样使用命令的例子 |
SEE ALSO | 相关主题(通常是手册) |
查找命令的地址
which which
:输出/user/bin/which
查找命令的二进制、源代码和手动页面文件
whereis whereis
:whereis: /usr/bin/whereis /usr/share/man/man1/whereis.1.gz
ctrl+c | 停止进程 |
ctrl+l | 清屏,=clear;彻底清屏是:reset(重新进入) |
tab键 | 提示;自动补全 |
上下键 | 查看执行过的命令 |
print working directory 打印工作目录
显示当前工作目录的绝对路径
pwd [选项]
选项 | 功能 |
---|---|
-P | 查看真实的目录(在软链接里可以跳转的路径) |
list 列出目录内容
ls \[选项][目录或是文件]
选项 | 功能 |
---|---|
-a | 全部文件,连同隐藏档(开头为.的文件)一起列出来 |
-l | 长数据串列出,包含文件的属性与权限等数据;等价于“ll” |
-h | 以易于阅读的格式输出文件大小(例如1k 23M 2G等) 通常与-s或-l搭配使用 |
-s | 以块数形式显示每个文件分配的尺寸 |
以树状图格式列出目录的内容
tree [选项] 目录
可能需要通过
sudo apt-get install tree
安装
选项 | 功能 |
---|---|
-d | 只列出目录 |
-f | 每个文件都显示的完整路径前缀 |
Change Directory 切换路径
cd (空格不能省)[参数]
参数 | 功能 |
---|---|
绝对路径 | |
相对路径 | |
~或缺省 | 回到该用户的home目录 |
- | 回到上次所在的目录 |
… | 回到当前目录的上一级目录 |
-P | 跳转到世纪物理路径,而非快捷方式路径 |
Make directory 建立目录
mkdir[选项]要创建的目录
选项 | 功能 |
---|---|
-p | 递归创建目录 |
mkdir a b #相对路径创建两个目录
mkdir /a /b #根目录下创建两个目录
mkdir -p a/a #在a目录下创建一个a目录
mkdir -p c/a/a #创建一个多层目录
Remove directory 移除目录
rmdir 要删除的空目录
rmdir c/a/a c/a c
#可简化为
rmdir -p c/a/a
创建空文件
touch 文件名称
touch a.txt
#不带文件后缀名时默认文本文档
copy 复制、覆盖文件或目录
cp [选项] 源文件或目录 目标目录或文件
选项 | 功能 |
---|---|
-r | 递归复制整个文件夹 |
cp a.txt b #复制a到b中
cp a.txt b/b.txt #用a.txt覆盖b/b.txt
cp -r b/ c/ #递归复制b中所有文件及文件夹到c目录下
删除
rm [选项] deleteFile
选项 | 功能 |
---|---|
-r | 递归删除目录中所有内容 |
-f | 强制删除操作,而不提示用于进行确认 |
-v | 显示指令的详细执行过程 |
-rf
,-rfv
rm -rf /*
:清理垃圾,建议在同学电脑上尝试[doge]移动文件与目录或重命名
mv oldNameFile newNameFile
重命名
mv /temp/movefile /targetolder
移动文件
mv /temp/a.txt /b.txt
移动并重命名文件
catch 查看文件内容,从第一行开始显示
打印文件信息到控制台
cat [选项] 需要查看的文件
选项 | 功能 |
---|---|
-n | 显示所有行的行号,包括空行 |
文件内容分屏查看器
基于VI编辑器
操作 | 功能 |
---|---|
空格(space) | 向下翻一页 |
Enter | 向下翻一行 |
q | 离开 |
Ctrl+F | 跳过未浏览的内容 |
Ctrl+B | 返回上一屏 |
查看大文件方便;分页显示文件内容;
less 需要查看的文件路径
操作 | 功能 |
---|---|
空格|[pagedown] | 向下翻动一页 |
[pageup] | 向上翻动一页 |
/字符串 | 查找【字串】,n:向下查找;N:向上查找 |
q | 离开less |
当输出内容过长,过多时,可以搭配“|less”查看阅读
如
ps aux | less
#分页显示进程信息说明
输出内容到控制台
echo\[选项][输出内容]
echo $系统变量
选项:
-e:支持反斜线控制字符转换
控制字符 | 作用 |
---|---|
\ | 转义字符 |
\n | 换行 |
\t | 制表符 |
echo $
双击tab键,查看所有系统变量
echo $举例 | |
---|---|
echo $PATH | 环境变量 |
echo $HOSTNAME | 主机名 |
echo $USER | 用户名 |
显示文件开头部分内容,默认情况下显示文件的前10行内容。
head [选项] 文件
head -n 5 文件
查看文件前5行内容
选项 | 功能 |
---|---|
-n<行数> | 指定显示头部内容的行数 |
输出文件尾部内容,默认情况下显示文件的后10行内容
tail [选项] 文件
选项 | 功能 |
---|---|
-n<行数> | 输出文件尾部n行内容 |
-f | 显示文件最新追加的内容,监视文件变化 暂停:ctrl+s 停止:ctrl+c |
ls -l >文件
列表的内容写入文件中(覆盖写)
ls -al>>文件
列表的内容追加到文件的末尾
cat b.txt>a.txt
用b.txt覆盖a.txt
echo "你好">>a.txt
追加“你好”到a.txt
link 链接
ln -s 源文件或目录 目标目录和软链接名
:软链接(创建一快捷方式)
ln 文件名 源文件
:硬链接(比软链接更底层,映射一个文件,只能针对文件)
inode
指向源文件在硬盘中的区块,与普通文件一样。源文件删除或移动后仍可以用硬链接访问。只有当该文件的硬链接数量为0时,才是真正意义上的删除
删除:
删除 | 作用 |
---|---|
rm -rf 软链接名 | 删除软链接 |
rm -rf软链接名/ | 删除软链接对应的真实目录下的所有文件 |
ln -s /home/lf/a.txt /home/lf/桌面/a #在桌面链接../a.txt
#源文件设置为绝对路径后才能保证软链接可移动到其它目录
历史命令
命令 | 作用 |
---|---|
history [|grep ***] | 显示所有历史记录[筛选历史中有***关键字的] |
history num | 显示最后num条记录 |
!num | 执行第num号记录 |
history -c | 删除历史记录 |
date[OPTION]...[+FORMAT]
选项 | 功能 |
---|---|
-d<时间字符串> | 显示指定的“时间字符串”表示时间,而非当前时间 |
-s<日期时间> | 设置系统日期时间 |
参数 | 说明 |
---|---|
<+时间日期格式> | 制定显示时使用的日期时间格式 |
语法 | 功能 |
---|---|
date | 当前时间 |
date +%Y|%m|%d | 输出当前年份|月份|日 |
date +“%Y-%m-%d %H:%M:%S” | 输出年月日时分秒 使用" "时里边才能有空格 否则需要连字符连接 |
date +%s | 时间戳 即1970-1-1 0:0:0到现在的秒数 常应用于日志 |
date -d '1 day'
:显示后一天时间
date -d '-1 day'
:显示前一天
date -s "年-月-日 时:分:秒"
ntpdate 服务器
同步时间
服务器 | 属 |
---|---|
time.windows.com | windows |
cn.ntp.org.cn | NTP授时快速域名服务 |
ntp.ntsc.ac.cn | 中国科学院国家授时中心 |
ntp.aliyun.com | 阿里 |
time1.tencentyun.com time2.tencentyun.com time3.tencentyun.com time4.tencentyun.com time5.tencentyun.com |
腾讯 |
cal[选项]
选项 | 功能 |
---|---|
空 | 显示当前月份 |
具体某一年 | 显示这一年的日历 |
-3 | 显示和当前月份相邻的三个月 包括当前 |
-m | 设置星期一开头 |
添加新用户
useradd 用户名
:添加新用户
useradd -g 组名 用户名
:添加新用户到某个组
adduser 用户名
:perl脚本,添加新用户同时配置用户其他信息除了root外用户都默认在/home/下
useradd -d /home/dave david
#创建一个叫david的用户,他的用户文件夹名叫dave
删除用户
sudo deluser
sudo deluser --remove-home
#删除用户及其著目录和邮件假脱机
sudo userdel -r
#删除用户的同时删除用户对应的目录
查看用户
id 用户名
用户id 组id 组
查看存在的用户
设置用户密码
passwd 用户名
switch user 切换用户
su 用户名
su|su -
切换root用户root切换其他用户不需密码
who am i | 最初创建这个会话的用户 |
whoami | 当前会话的用户 |
who | 当前登陆的用户及登陆的tty |
退出当前用户
普通用户的root权限
- 不必与其他用户共享权限,可以在
/var/log/auth.log
中查看用户运行的民了的日志条目
sudo -l -U 用户名
#检查用户是否有sudo权限
sudo adduser 用户名 sudo
#方法一,授权sudo权限
sudo usermod -aG sudo 用户名
#方法二,将用户添加到sudo组中
sudo deluser 用户名 sudo
#撤销用户的sudo权限
sudo passwd -d senthil sudo
sudo cat /etc/sudoers
#sudo权限的配置文件
# User privilege specification
root ALL=(ALL:ALL) ALL
用户名 ALL=(ALL:ALL) ALL
#授予用户与root相同的权限
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL NOPASSWD:ALL
#后边加上NOPASSWD:ALL可以在不输入密码的情况下使用sudo权限
#组的权限
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "@include" directives:
@includedir /etc/sudoers.d
修改用户组
usermod [选项] 用户组 用户名
选项 | 功能 |
---|---|
-g | 修改用户的初始登陆组,给定的组必须存在。默认组id是1. |
-f | n天数后,设定密码为失效状态 |
-L | 锁定该用户 |
默认情况下一个用户一个组
查看存在哪些组
新增组
groupadd 组名
删除组
groupdel 用户名
选项 | 功能 |
---|---|
-n | 重命名 groupmod -n 旧名 新名 |
文件类型 | 属性权限 | 属组权限 | 其他用户权限 | ||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
d(文件) l(链接) |
r | w | x | r | w | x | r | w | x |
目录文件 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 |
-rw------- 1 lf lf 10168 6月 26 18:48 .viminfo
#文件类型权限 链接数 所属者 所属组 文件大小 最后一次更改时间 文件名
复制粘贴移动文件后一般文件权限不会改变
a all |
u user |
g group |
o other |
||||||
文件类型 | 属性权限 | 属组权限 | 其他用户权限 | ||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
d(文件) l(链接) |
r | w | x | r | w | x | r | w | x |
目录文件 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 |
chmod [{u|g|o|a}{+|-|=}{rwx}] 文件和目录
chmod [mode=421] [文件或目录]
r=4 w=2 x=1
rwx=7
把每个权限的有无就是1(有)或0(无),其二进制对应的10进制数就是具体权限
rwx:111转换成10进制则为7
rw-:110转换为10进制为6
-w-:010转换为10进制为2
mode | 权限 |
---|---|
1 | –x |
2 | -w- |
3 | -wx |
4 | r– |
5 | r-x |
6 | wr- |
7 | wrx |
chmod 777 a.txt
#将a.txt设置为全部用户可读、写、执行,即rwxrwxrwx
chmod -R 644 a
#文件a及文件a中所有权限改为rwxrw-rw-
改变文件和目录所有者
chown [选项][用户][文件或目录]
选项 | 功能 |
---|---|
-R | 递归 |
chown a.txt test
#把a.txt的所属者改为test
改变所属组
chgrp [用户][文件或目录]
chgrp a.txt test
#把a.txt的所属组改为test
将从指定目录向下递归地便利各个子目录,将满足条件的文件显示在终端
find [搜索范围] [选项]<具体要求>
选项 | 功能 |
---|---|
-name<查询方式> | 按照制定的文件名查找模式查找文件 |
-user<用户名> | 查找数据指定用户名所有文件 |
-seze<文件大小> | 按照指定的文件大小查找文件,单位为: b——块(512字节) c——字节 w——字(2字节) k——千字节 M——兆字节 G——吉字节 |
find / -name "*.txt"
#查询根目录下以.txt结尾的文件
find / -size +10M
#查询根目录下大于10M的文件
grep,过滤查找
”|“,管道符,将前一个命令的处理结果输出给传递给后面的命令处理
grep选项 | 功能 |
---|---|
-n | 输出的同时打印行号 |
grep -n boot test.txt
#查找并输出test.txt文件中含有boot的行(包括行号)
word count
打印对每个给定文件的新行、单词和字节计数的结果;如果指定了超过
一个文件,则还会打印一个总行数。此处的一个单词是指由空白字符分隔的
长度大于零的字符序列。可以和搜索筛选配合使用
wc a.txt
47 42 144 a.txt
47行 42个单词 144个字节数
joey@Jarvis:~$ sudo ls / |grep t|wc
7 7 37
#统计查找根目录下有t的文件的结果行数、单词数和字节数
gzip 文件
:将文件压缩为.gz文件
gnzip 文件.gz
:解压
zip [选项] 压缩后的文件名和目录 文件地址
:压缩文件和目录
unzip -d 将解压后的文件名地址 文件地址
:解压缩文件
zip选项 | 功能 |
---|---|
-r | 压缩目录 |
unzip选项 | 功能 |
---|---|
-d<目录> | 指定解压后文件的存放目录 |
打包目录,压缩后的文件格式
.tar.gz
tar [选项] XXX.tar.gz 将要打包的目录或文件
选项 | 功能 |
---|---|
-c | 产生.tar打包文件 |
-v | 显示详细信息 |
-f | 指定压缩后的文件名 |
-z | 打包时压缩 |
-x | 解包.tar文件 |
-C | 解压到指定目录 |
tar -zcvf a.tar.gz a.txt b/
#将a.txt与b文件夹合并打包成a.tar.gz
tar -zxvf a.tar.gz [-C /tmp/]
#解压a.tar.gz[至/tmp/]
disk usage 查看文件和目录占用的磁盘空间
du 目录或文件
显示目录下每个子目录的磁盘占用情况
选项 | 功能 |
---|---|
-h | 以人们可读的格式输出大小(例如,1K 234M 2G) |
-a | 输出所有文件的磁盘用量,不仅仅是目录 |
-c | 显示总计信息 |
-s | 只分别计算命令列中每个参数所占的总用量 |
–max-depth=n | 指定统计子目录的深度为第n层 |
du -sh
#查看当前目录占用大小
disk free 空余磁盘
df [选项] 目录
列出文件系统的整体磁盘使用量,检查文件系统的词阿婆弄空间占用情况
选项 | 功能 |
---|---|
-h | 以人们可读的格式输出大小(例如,1K 234M 2G) |
内存的使用情况
free
free -h
# 物理 占用 共享 缓存
total used free shared buff/cache available
内存: 14Gi 4.6Gi 7.3Gi 274Mi 3.1Gi 9.8Gi
交换: 15Gi 0B 15Gi
列出块设备的信息
lsblk [选项] [<设备> …]
选项 | 功能 |
---|---|
-f | 输出文件系统信息 |
mount [-t 文件系统类型] [-o options] 要挂载的设备 设备在系统上的挂载点
:挂载设备
umount文件名或挂载点
:卸载设备
参数 | 功能 | |
-t 文件类型 | 通常不必指定。mount会自动选择正确的类型 | |
常用类型 | ||
光盘或光盘镜像 | iso9660 | |
DOS fat16文件系统 | msdos | |
Windows 9x fat32文件系统 | fat | |
Windows NT ntfs文件系统 | ntfs | |
Monunt Windows文件网络共享 | smbfs | |
UNIX文件网络共享 | nfs | |
-o 挂载方式 | 主要描述设备或档案的挂载方式 | |
常用参数 | ||
loop | 用来把一个文件爱你当成硬盘分区挂接在上系统 | |
ro | 参用只读方式挂接设备 | |
rw | 采用读写方式挂载设备 | |
iocharset | 指定访问文件系统所用字符集 |
设置开机启动自动挂载
vim /etc/fstab
/dev/cdrom /mnt/cdrom iso9660 defaults 0 0
即可# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
# / was on /dev/nvme0n1p7 during installation
UUID=94dabec9-e77a-4f4f-8a5a-f266512c4df1 / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=5E11-9EBB /boot/efi vfat umask=0077 0 1
# swap was on /dev/nvme0n1p6 during installation
UUID=309e3596-17f2-43f0-ad6e-46c8e5d2ae3e none swap sw 0 0
#
UUID 挂载点 文件系统类型 选项 是否开启kdump(备份) 文件系统检查的优先级
分区
fdisk [选项] 硬盘设备名
:对新增硬盘进行分区操作
选项 | 功能 |
---|---|
-l | 显示所有硬盘的分区列表 |
process status 进程管理
ps [选项] [|grep xxx] [|less]
ps aux |grep xxx
查看系统中所有进程的cpu占用率和内存占用率
ps -ef |grep xxx
可以查看进程的父进程ID可以使用ef
选项 | 功能 |
---|---|
a | 列出带有终端的所有用户的进程 |
x | 列出当前用户的所有进程,包括没有终端的进程 |
u | 面向用户友好的显示风格 |
-e | 列出所有进程。与 ax相同。 |
-u 用户名 | 列出某个用户关联的所有进程 |
-f | 显示完整格式的进程列表 |
ps aux
USER:该进程是由哪个用户产生的
PID:进程的ID号
%CPU:该进程占用CPU资源的百分比
%MEN:该进程占用物理内存的百分比
VSZ:该进程占用虚拟内存的大小,单位KB
RSS:该进程占用世纪物理的大小,单位KB
TTY:该进程是在哪个终端运行的。对于Ubuntu来说,tty1是图形化界面
tty2-tty6是本地的字符界面终端。pts/0~255代表虚拟终端。
STAT:进程状态。常见的状态有:R:运行、S:睡眠、T:暂停、Z:僵尸、s:包含子进程、I:多线程、+:前台显示、<:优先级较高、N:优先级比较低
START:该进程的启动时间
TIME:该进程占用CPU的运行时间,
COMMAND:产生该进程的命令名
ps -ef
UID:用户名
PID:进程ID
PPID:进程的附属进程ID
C:CPU计算优先级,数值越小,优先级越高
STIME:启动时间
TTY:终端
TIME:占用CPU计算的时间
CMD:调用当前进程命令
ps -ef |grep sshd
#查看有哪些sshd进程
systemctl status sshd
#查看sshd的状态
kill [选项] 进程号 通过进程号杀死进程
killall 进程名称 通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很满时很有用,但不推荐
kill PID\PPID
#将远程登陆的某个用户踢出
#PID和PPID可以通过ps -ef |grep sshd 命令查看
#如果PID是名为/usr/sbin/sshd -D的守护进程,关闭之前登陆的用户可正常使用,PPID变为1。但此后远程登陆的进程exit或被kill后不可再次登陆,也不可新建连接
#sshd被关闭后可通过systemctl start sshd 重新开启,但在关闭sshd之前且并未在sshd开启之前的仍然保持连接的进程(PPID转为1的远程登陆进程),在开启sshd之后PPID仍为1。之后连接的PPID为sshd的PID
killall sshd
#关闭所有sshd有关的进程(包括守护进程),此时无法通过远程ssh连接,除非在物理机上重新打开sshd
查看进程树
pstree [选项]
选项 | 功能 |
---|---|
-p | 显示进程的PID |
-u | 显示进程的所属用户 |
top [选项]
实时监控系统进程状态
选项 | 功能 |
---|---|
-d 秒数 | 指定top命令每隔几秒更新。默认是3秒在top命令的交互模式当中可以执行的命令 |
-i | 使top不显示任何闲置或僵死进程 |
-p (pid) | 通过指定监控进程ID来仅仅监控某个进程的状态 |
操作 | 功能 |
---|---|
P | 以CPU使用率排序,默认选项 |
M | 以内存的使用率排序 |
N | 以PID排序 |
u | 查找某个用户的进程 |
k | kill某个进程 |
q | 退出top |
显示网络状态和端口占用信息
netstat -anp|grep 进程号
查看该进程网络信息
netstat -nlp|grep 端口号
查看网络端口号占用情况
选项 | 功能 |
---|---|
-a | 显示所有正在监听(listen)和未监听的套接字(socket) |
-n | 拒绝显示别名,能显示数字的全部转化为数字 |
-l | 仅列出在监听的服务状态 |
-p | 表示显示那个进程在调用 |
systemctl restart cron
#重启crond服务
crond [选项]
选项 | 功能 |
---|---|
-e | 编辑crontab定时任务 |
-l | 查询crontab任务 |
-r | 删除当前用户所有的crontab任务 |
*****执行的任务
项目 | 含义 | 范围 |
---|---|---|
第一个“*” | 一小时当中的第几个分钟 | 0~59 |
第二个“*” | 一天中的第几个小时 | 0~23 |
第三个“*” | 一个月当中第几天 | 1~31 |
第四个“*” | 一年中的第几个月 | 1~12 |
第五个“*” | 一周当中的星期几 | 0~7(0=7,代表星期天) |
符号 | 含义 |
---|---|
* | 代表任何时间。比如第一个“*”代表一小时每分钟都执行一次 |
, | 代表不连续的时间。例如“0 8,12,16 * * *”每天8:00,12:00,16:00都执行一次 |
- | 代表连续的时间范围。例如“0 5 * * 1-6”周一到周六的5:00执行命令 |
*/n | 代表每隔多久执行一次。例如“*/10 * * * *”每隔10分钟就执行一次命令 |
*/1 * * * * echo “hello,world” >> /usr/home/joey/hello
#每隔1分钟追加一个hello,world到'/usr/home/joey/hello'文件
RedHat package Manager
RPM包的名称格式:
软件名-版本号.软件所运行的硬件平台.文件拓展名
rpm -qa [|grep xxx]
#查询由rpm安装的软件
rpm -qi xxx
#查询由rpm安装的某个软件的详细信息
rpm -e RPM软件包 #卸载软件包
rpm -e --nodeps 软件包 #强行卸载软件包,不检查依赖
rpm -i #install,安装
rpm -v #--verbose,显示详细信息
rpm -h #-hash,进度条
rpm --nodeps #安装前不检查依赖
Advanced Packaging Tool
apt [可选项] [操作] [包名]
可选项有
-h
帮助,-y
安装过程全部选择都为“yes”,-q
不显示安装过程
操作 | 功能 |
---|---|
update | 从配置的源下载包信息 |
upgrade | 从配置的源安装当前系统中的所有包的可用升级 |
full-upgrade | 执行升级功能,如果需要将系统升级到新的版本,则会删除当前已安装的包 |
install | 安装一个或多个指定的包 |
remove | 删除包,但是会保留包的配置文件 |
purge | 删除包的同时删除其配置文件;不要对不熟悉的包运行这个 |
autoremove | 删除自动安装的包,这些包是为了满足其他包的依赖关系而自动安装的,随着依赖关系的更改或需要它们的包已被删除,这些包现在不再需要了 |
search | 在可用包列表中搜索给定的项并显示匹配到的内容 |
show | 显示关于给定包的信息,包括它的依赖关系、安装和下载大小、包的来源、包内容的描述等等 |
list | 显示满足特定条件的包列表,默认列出所有的包 |
sudo apt edit-sources | edit-sources 命令用来编辑 /etc/apt/source.list 文件 指定官方的软件仓库【默认美国】 |
sudo apt update #更新源
sudo apt install xxx #安装软件
sudo apt remove xxx #删除软件
sudo apt show xxx #获取包的相关信息
sudo apt source xxx #下载该软件的源代码
sudo apt list --upgradeable #列出可更新的软件包及版本信息
sudo apt upgrabe #升级软件
Debian软件包管理器的基础,被用于安装、卸载和供给和.deb软件包相关的信息
dpkg -i package.deb #安装包
dpkg -r package #删除包
dpkg -P package #删除包(包括配置文件)
dpkg -L package #列出与该包关联的文件
dpkg -l package #显示该包的版本
dpkg –unpack package.deb #解开 deb 包的内容
dpkg -S keyword #搜索所属的包内容
dpkg -l #列出当前已安装的包
dpkg -c package.deb #列出 deb 包的内容
dpkg –configure package # 配置包
Yellow dog Updater,Modified
基于RPM包管理,可以自动处理依赖性关系
yum [-y] [参数]
参数 | 功能 |
---|---|
install | 安装rpm软件包 |
update | 更新rpm软件包 |
check-update | 检查是否有可用的更新rpm软件包 |
remove | 删除指定的rpm软件包 |
list | 显示软件包信息 |
clean | 清理yum过期的缓存 |
deplist | 显示yum软件包的所有依赖关系 |
info | 软件信息 |
ubuntu server下载GUI
#更新依赖
sudo apt update && sudo apt upgrade
#GNOME(推荐)
apt-get install ubuntu-desktop
#其它桌面
#MATE
sudo apt install ubuntu-mate-core
#lubuntu
sudo apt install lubuntu-core
#Xfce
sudo apt install xubuntu-core
#卸载
#某些情况下删除 GUI 可能会带来依赖问题,因此请备份好重要数据或创建一个系统快照
sudo apt remove ubuntu-desktop
sudo apt autoremove
是一个在终端上显示带有发行徽标的系统信息工具,neofetch命令将显示有关相应系统的简要信息。 显示的信息包括: 型号、操作系统、内核、CPU、GPU、内存、正常运行时间、程序包、shell、分辨率、DE、WM、WM主题、主题、图标和终端等
#下载
sudo apt install neoretch
#使用
neofetch
开源的音视频播放软件
ffplay xxx.mp4
sudo apt install ffmpeg
#若无法下载成功,请尝试换阿里源
剪切板
可记录图片
sudo apt install copyq
开源的数据压缩程式
系统自带的就已经够用了,不用下,.7z文件也能解压
sudo apt install p7zip
sudo apt install aria2 -y
aria2c url
#基础下载
aria2c -o name.type url
#下载后改名
aria2c -Z url url
#多个文件
aria2c -bt-tracker=url
#磁力链接下载
读取、转换并输出数据
sudo fdisk -l
#查看u盘设备如“/dev/sda”等
sudo umount /dev/sda
#卸载U盘
#地址由实际情况决定
sudo dd if=xxx.iso of=/dev/sda
#制作启动盘
#地址由实际情况决定
内网穿透工具
curl -s https://install.zerotier.com | sudo bash
或者
sudo apt install gpg
curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/master/doc/contact%40zerotier.com.gpg' | gpg --import && \
if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi
sudo apt install zerotier-one -y
可以远程操作机器
#下载
sudo apt install ssh
#查询ssh状况
sudo systemctl status ssh
#连接
ssh user@remote -p port
#生成密钥
ssh-keygen
#公钥在 ~/.ssh/id_rsa.pub
#私钥在 ~/.ssh/id_rsa
#将公钥传送到远程主机host上
ssh-copy-id user@host
#或者将公钥追加在 ~/.ssh/authorized_keys末尾
#公钥上传成功后可以免密码登陆
ssh user@ip
#ssh设置
vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes #root用户是否能用ssh登录
PasswordAuthentication yes # 密码验证
Port # 可修改ssh访问端口,默认为22。默认在本机的所有网络接口上监听。端口范围:0~65535,不能与已有的服务器端口冲突
PermitEmptyPasswords #是否允许密码为空的用户远程登录。默认为"no"
PermitRootLogin #是否允许ssh远程登录root帐号,建议为no
ClientAliveInterval 0 #客户端连接数做限制,根据需求设置
UseDNS #指定sshd是否应该对远程主机名进行方向解析,以检查此主机名是否与其IP地址真实对应。默认值为"yes"。个人建议改成no,否则可能会导致ssh连接很慢
GSSAPIAuthentication no #解决Linux之间使用SSH远程连接慢的问题
AllowUsers user1 user2 user3 #允许ssh登录用户
DenyUsers #禁止ssh登陆用户
AllowGroups #允许ssh登录用户组
DenyGroups #禁止ssh登陆用户组
service sshd restart #重启sshd服务以生效
#远程下载至本地
scp user@ip:path localpath
scp -r user@ip:path localpth #-r 可递归
#本地上传服务器
scp localpath user@ip:path
scp -r localpath user@ip:path #-r 可递归
是一种用于Linux内核中的虚拟化基础设施,可将Linux内核转化为一个虚拟监视器
超牛[doge]
想要运行超过 2GB 内存的客户机,你必须拥有一个 64位主机系统
grep -Eoc '(vmx|svm)' /proc/cpuinfo #如果你的 CPU 支持硬件虚拟化,这个命令将会打印出大于0的数字,这代表 CPU 核心数目。否则,如果输出为0,它意味着这个 CPU 不支持硬件虚拟化
kvm-ok #如果出现以下信息则已开启虚拟化 #KVM acceleration can be used
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
qemu-kvm
- 为 KVM 管理程序提供硬件模拟的软件程序
libvirt-daemon-system
- 将 libvirt 守护程序作为系统服务运行的配置文件
libvirt-clients
- 用来管理虚拟化平台的软件
bridge-utils
- 用来配置网络桥接的命令行工具
virtinst
- 用来创建虚拟机的命令行工具
virt-manager
- 提供一个易用的图形界面,并且通过libvirt 支持用于管理虚拟机的命令行工具
一旦软件包被安装好,libvirt 守护程序将会自动启动。你可以通过运行下面的命令,验证它:
sudo systemctl is-active libvirtd
输出:
active
想要创建和管理虚拟机,你需要添加你的用户到“libvirt” 和 “kvm” 用户组。输入:
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
$USER是一个环境变量,用来记住当前登录用户的名字。
登出,并且重新登录,以便用户组被刷新。
在libvirt 安装过程中,一个被称为 “virbr0”的桥接设备默认被创建。这个设备使用 NAT 来连接客户机到外面的世界。
运行 brctl
工具来列出当前的桥接和它们连接的接口:
brctl show
输出:
bridge name bridge id STP enabled interfaces
virbr0 8000.52540089db3f yes virbr0-nic
“virbr0” 桥接没有添加任何的物理接口。“virbr0-nic”是一个虚拟设备,没有任何流量通过。这个设备唯一的目的就是避免修改“virbr0” 桥接的 MAC 地址。
网络设置适合大部分 Ubuntu 桌面用户,但是有限制。如果你想从外面的本地网络访问客户机,你需要创建一个新的桥接,并且配置它,以便客户机可以通过主机的物理接口连接到外部世界。
现在 KVM 在你的 Ubuntu 桌面被安装,让我们一起去创建第一个虚拟机。我们可以从命令行或者使用virt-manager应用。
下载你想要安装的操作系统的 ISO 镜像并且按照下面的步骤来创建你的虚拟机:
在搜索栏输入“Virtual Machine Manager”并且点击图标来启动应用。
在应用启动后,从顶部菜单点击“File” -> “New Virtual Machine”:
一个新窗口将会显示。选择 “Local install media” 并且点击 “Forward” 按钮。
提供你的 ISO 镜像路径,并且点击 Forward 按钮。
在下一个屏幕,选择虚拟机 VM 的内存和 CPU 设置。点 Forward。
下一步,选择“Create a disk image for the virtual machine” 并且选择虚拟机的磁盘空间大小。点击 Forward。
输入你的虚拟机名字并且点击 “Finish”。
虚拟机启动,并且一个新窗口将会打开:
从这里,你就可以按照屏幕的操作,去完成操作系统的安装。
一旦操作系统被安装好,你可以从virt-manager
去访问它,使用 ssh 或者使用 Serial Console
提供兼容层来将Windows的系统调用转换成与POSIX标准的系统调用。
可以在其他操作系统上使用windows软件
#开启32bit框架支持
sudo dpkg --add-architecture i386
#添加仓库密钥
sudo wget -nc -O /usr/share/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
#添加仓库
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
sudo apt update
sudo apt install --install-recommeds winehq-stable
[wine官网下载][https://wiki.winehq.org/Download]
在线安装一直无法定位包
可以先下载包再安装
wget -nc https://dl.winehq.org/wine-builds/winehq.key
sudo mv winehq.key /usr/share/keyrings/winehq-archive.key
#仓库密钥
wget -nc https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources
sudo mv winehq-jammy.sources /etc/apt/sources.list.d/
#仓库
sudo apt update
sudo apt-get clean
sudo apt-get --download-only install winehq-devel
sudo apt-get --download-only dist-upgrade
#下载包至/var/cache/apt/archives/
sudo cp -R /var/cache/apt/archives/ ~/wine
#将下载好的文件复制到指定目录(也可指定到U盘中)
cd ~/wine#切换到含有所有软件包的目录
sudo dpkg -i *.deb #安装该目录下所有.deb
[命令列表][https://wiki.winehq.org/List_of_Commands]
wine winecfg #wine的GUI配置工具
#程序中的字体大小可以在这里设置【显示-屏幕分辨率】
wineboot #重启
wine taskmgr #任务管理器
wine notepad #记事本
wine regedit #wine的注册表
wine control #wine的控制面板ex
[推荐阅读][https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04]
链接2
sudo apt-get install mysql-server
#以root登录MySQL(sudo会绕过密码提示)
sudo mysql -u root
#切换到mysql数据库并将插件设置mysql_native_password为root用户。
USE mysql;
UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;
#您必须更改root密码才能使用。即使只是指定当前密码也可以,但必须执行此命令:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password_here';
exit;
#最后,重新启动 MySQL 以使更改生效。
sudo systemctl restart mysql
查看临时密码
grep 'temporary password' /var/log/mysqld.log
找回Mysql的密码
vim /etc/my.conf
#添加
#skip-grant-tables
#重启msyql
service mysqld restart
#修改密码
mysql -u root -p
#回车即可跳过密码验证登录
use mysql;
update user set authentication_string=password("newPassword") where user='root';
flush privileges;
exit;
vim /etc/my.conf
#注销skip-grant-tables
先占位[doge]
cd /mnt
#此时ls就可选c、d、等盘符
windows使用LocalTime机制,与bios里的时间保持一致
ubuntu使用UTC机制,将bios里的时间视为UTC+0
由于时间同步机制不同,两个系统都会修改bios时间
sudo apt update
sudo apt -y install ntpdate
sudo ntpdate time.windows.com
sudo hwclock --localtime --systohc #修改时间同步机制并同步bios硬件时间
sudo vim /etc/default/grub
GRUB_DEFAULT=2
#默认启动项,从上至下(从0开始)
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
sudo update-grub
#更新
Shell是一个命令解释器,他为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至编写一些程序
shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
Linux提供的Shell解析器有
[ec2-user@ip-172-31-46-30 ~]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
bash和sh的关系
[ec2-user@ip-172-31-46-30 bin]$ ls -|grep bash
-rwxr-xr-x. 1 root root 1390168 Nov 5 2021 bash
lrwxrwxrwx. 1 root root 10 Nov 5 2021 bashbug -> bashbug-64
-rwxr-xr-x. 1 root root 7079 Nov 5 2021 bashbug-64
lrwxrwxrwx. 1 root root 4 Nov 5 2021 sh -> bash
CentOS默认的解析器是bash
[ec2-user@ip-172-31-46-30 bin]$ echo $SHELL
/bin/bash
#!/bin/sh
#当前shell的默认解析器
echo 'hello,word!'
执行
采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
sh hello.sh
bash hello.sh
#把文件当作参数传入
#另起一个sh或bash的进程执行命令
先赋予脚本权限
chmod +x hello.sh
./hello.sh
#单独嵌套一个shell
直接source或.
source hello.sh
. hell.sh
#直接在当前环境运行
前两种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中
第三种,可以使脚本内容在当前shell里执行,而无需打开shell!这也是为什么我们每次修改完/etc/profile文件以后,需要source一下的原因
[ec2-user@ip-172-31-46-30 script]$ echo $HOME
/home/ec2-user
[ec2-user@ip-172-31-46-30 script]$ echo $PWD
/home/ec2-user/script
[ec2-user@ip-172-31-46-30 script]$ echo $SHELL
/bin/bash
[ec2-user@ip-172-31-46-30 script]$ echo $USER
ec2-userv
[ec2-user@ip-172-31-46-30 script]$ set
#系统和用户定义de全局和局部变量都有
[ec2-user@ip-172-31-46-30 script]$ env
#系统定义的全局变量
基本语法
export my_var
变量定义规则
例子
joey@Jarvis:~$ A=5;echo $A; #定义变量A
5
joey@Jarvis:~$ A=8;echo $A; #给变量A重新赋值
8
joey@Jarvis:~$ unset A;echo $A; #撤销变量A
joey@Jarvis:~$ readonly B=2;echo $B; #声明静态的变量B=2
2
joey@Jarvis:~$ B=3; #静态变量不能更改
-bash: B: readonly variable
joey@Jarvis:~$ unset $B; #静态变量不能unset
joey@Jarvis:~$ echo $B;
2
joey@Jarvis:~$ C=1+2;echo $C; #bash中,变量默认类型都是字符串类型,无法直接进行数值运算
1+2
joey@Jarvis:~$ C=$((1+2));echo $C;
3
joey@Jarvis:~$ C=$[1+3];echo $C;
4
joey@Jarvis:~$ D=I love you; #变量的值如果有空格,需要使用双引号或单引号括起来
-bash: love: command not found
joey@Jarvis:~$ D="I love you";echo $D;
I love you
#可把变量提升为全局环境变量,可供其他shell程序使用
export 变量名;
export B;
基本语法
$n
n为数字,$0代表该脚本名称,$1~ 9 代表第一到第九个参数,十以上的参数用大括号包含 9代表第一到第九个参数,十以上的参数用大括号包含 9代表第一到第九个参数,十以上的参数用大括号包含{11}
joey@Jarvis:~$ cat parameter.sh
#!/bin/bash
echo '============$n==========';
echo script name:$0;
echo lst patamater:$1;
echo 2nd patameter:$2;
joey@Jarvis:~$ ./parameter.sh x h
============$n==========
script name:./parameter.sh
lst patamater:x
2nd patameter:h
获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性
joey@Jarvis:~$ cat parameter.sh
#!/bin/bash
echo '============$n==========';
echo script name:$0;
echo lst patamater:$1;
echo 2nd patameter:$2;
echo '============$#==========';
echo parameter numbers:$#;
joey@Jarvis:~$ ./parameter.sh hello world
============$n==========
script name:./parameter.sh
lst patamater:hello
2nd patameter:world
============$#==========
parameter numbers:2
∗ 这个变量代表命令行中所有的参数, ∗ ∗ * 这个变量代表命令行中所有的参数,** ∗这个变量代表命令行中所有的参数,∗∗把所有的参数看成一个整体*
@ z 合格变量也代表命令行中所有的参数,不过 ∗ ∗ @ z合格变量也代表命令行中所有的参数,不过** @z合格变量也代表命令行中所有的参数,不过∗∗@把每个参数区分对待**
joey@Jarvis:~$ cat parameter.sh
#!/bin/bash
echo '============$n==========';
echo script name:$0;
echo lst patamater:$1;
echo 2nd patameter:$2;
echo '============$#==========';
echo parameter numbers:$#;
echo '============$*==========';
echo $*;
echo '============$@==========';
echo $@;
joey@Jarvis:~$ ./parameter.sh hed d d d
============$n==========
script name:./parameter.sh
lst patamater:hed
2nd patameter:d
============$#==========
parameter numbers:4
============$*==========
hed d d d
============$@==========
hed d d d
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
joey@Jarvis:~$ parameter.sh
-bash: parameter.sh: command not found
joey@Jarvis:~$ echo $?
127 #没有对应命令
"$((运算式))"
"$[运算式]"
expr 运算式(每个字符之间有空格)
a=$((1+5))
b=$[1+5]
echo $a $b
expr $a + $b #注意运算符之间有空格
expr $a - $b
expr $a \* $b
expr $a / $b
命令替换
将命令执行的结果替换过来
joey@Jarvis:~$ c=$(expr 2 \* 7);echo $c;
14
joey@Jarvis:~$ d=`expr 3 \* 7`;echo $d;
21
test condition
joey@Jarvis:~$ a=1
joey@Jarvis:~$ test $a = 1;echo $?;
0 #true
joey@Jarvis:~$ test $a = 2;echo $?;
1 #false
[condition](注意condition前后要有空格)
非空即为true,[1]为true,[ ]为false
joey@Jarvis:~$ a=2;
joey@Jarvis:~$ [ $a = 2 ];echo $?
0 #true
joey@Jarvis:~$ [ $a = 1 ];echo $?
1 #false
joey@Jarvis:~$ [ 1 ];echo $?;
0
joey@Jarvis:~$ [ 0 ];echo $?;
0
joey@Jarvis:~$ [ ];echo $?;
1
joey@Jarvis:~$ [ ];echo $?;
1
两个整数之间比较
原 | 含义 | |
---|---|---|
-eq | equal | 等于 |
-ne | not equal | 不等于 |
-lt | less than | 小于 |
-le | less equal | 小于等于 |
-gt | greater than | 大于 |
-ge | greater equal | 大于等于 |
如果是字符串之间的比较,用等号“=”判断相等;用“!=”判断不等
按照文件权限进行判断
原 | 含义 | |
---|---|---|
-r | read | 有读的权限 |
-w | write | 有写的权限 |
-x | execute | 有执行的权限 |
按照文件类型进行判断
原 | 含义 | |
---|---|---|
-e | existence | 文件存在 |
-f | file | 文件存在并且是一个常规的文件 |
-d | directory | 文件存在并且是一个目录 |
多条件判断
&&表示前一条命令执行成功时,才执行后一条命令
||表示上一条命令执行失败后,才执行吓一条命令
if [ 条件 ];then
#程序
fi
#或者
if [ 条件 ]
then
#程序
fi
if [ 条件 ]
then
#程序
elif [ 条件 ]
then
#程序
else
#程序
fi
[ 条件 ]
,中括号和条件之间必须有空格joey@Jarvis:~$ cat if.sh
#!/bin/bash
#输入一个字符,1,返回"你好";2,返回"hello";其他返回null;
if [ $1 = 1 ]
then
echo "你好"
elif [ $1 = 2 ]
then
echo "hello"
else
echo null;
fi
case 变量 in
"值1")
#变量=值1时,程序
;;
"值2")
#变量=值2时,程序
;;
"值3")
#变量=值3时,程序
;;
*)
#default,程序
;;
esac
in
,每个模式匹配必须以右括号)
结束;;
表示命令序列结束,相当于java中的break*)
表示默认模式,相当于java中的defaultjoey@Jarvis:~$ cat case.sh
#!/bin/bash
#输入一个字符,1,返回"你好";2,返回"hello";其他返回default;
case $1 in
"1")
echo "你好"
;;
"2")
echo "hello"
;;
*)
echo "default"
;;
esac
for((初始值;循环条件;变量变化))
do
#程序
done
joey@Jarvis:~$ cat for.sh
#!/bin/bash
#1~100之和
sum=0;
for((i=1;i<101;i++))
do
sum=$[$sum+$i];
done
echo $sum;
for 变量 in ...
do
#程序
done
joey@Jarvis:~$ cat for2.sh
#!/bin/bash
#输出传入的所有参数
for i in $*
do
echo $i
done
echo "=================="
for j in $@
do
echo $j
done
∗ 和 *和 ∗和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1、$2、$3、 4 … 4… 4…n的形式输出所有参数
当他们被双引号包含时,$*会将所有的参数作为一个整体,以“$1 $2 $3 … n ”的形式输出所有参数; n”的形式输出所有参数; n”的形式输出所有参数;@会将各个参数分开,以“$1”、“$2”、“ 3 ” … . “ 3”….“ 3”….“n”的形式输出所有参数
joey@Jarvis:~$ cat bar.sh
echo "Arg 1:$1"
echo "Arg 2:$2"
echo "Arg 3:$3"
echo end
joey@Jarvis:~$ cat foo.sh
echo '$* without quotes:'
./bar.sh $*
echo '$@ without quotes:'
./bar.sh $@
echo '$* with quotes:'
./bar.sh "$*"
echo '$@ with quotes:'
./bar.sh "$@"
joey@Jarvis:~$ ./foo.sh hello world 001
$* without quotes:
Arg 1:hello
Arg 2:world
Arg 3:001
end
$@ without quotes:
Arg 1:hello
Arg 2:world
Arg 3:001
end
$* with quotes:
Arg 1:hello world 001
Arg 2:
Arg 3:
end
$@ with quotes:
Arg 1:hello
Arg 2:world
Arg 3:001
end
while [条件]
do
#程序
done
joey@Jarvis:~$ cat while.sh
#!/bin/bash
#1~100之和
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
echo $sum
done
echo $sum;
read [选项] (参数)
选项
-P
:指定读取值时的提示符
-t
:只当读取值时的等待的事件
参数
指定读取值的变量名
joey@Jarvis:~$ cat read.sh
#!/bin/bash
#提示7秒内,读取控制台输入的名称
read -t 7 -p "Enter your name in 7 seconds:" Name
echo $Name
basename [string/pathname] [suffix]
basename命令会删掉所有的前缀包括最后一个(‘/‘)字符,然后将字符串显示出来
basename 可以理解为取路径里的文件名称
选项
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
joey@Jarvis:~$ basename /home/joey/for.sh
for.sh
joey@Jarvis:~$ basename /home/joey/for.sh.name .name
for.sh
joey@Jarvis:~$ basename -s .name /home/joey/for.sh.name
for.sh
joey@Jarvis:~$ basename -as .name /home/joey/for.sh.name /home/joey/while.sh.name
for.sh
while.sh
joey@Jarvis:~$ basename -as .name /home/joey/for.sh.name/ /home/joey/while.sh.name/
for.sh
while.sh
dirname 文件绝对路径
从给定的包含绝对路径的文件名中取出文件名(非目录的部分),然后返回剩下的路径(目录的部分)
dirname 可以理解为取文件路径的绝对路径名称
joey@Jarvis:~$ dirname /home/joey/for.sh
/home/joey
[ function ] funname[()]
{
Action;
[return int;]
}
joey@Jarvis:~$ cat fun.sh
#!/bin/bash
#计算连个输入参数的和
function sum(){
sum=0;
sum=$[$1+$2];
echo "$sum";
}
read -p "Please input the number1:" n1;
read -p "Please input the number2:" n2;
sum $n1 $n2;
正则表达式使用带个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep、sed、awk等文本处理工具都支持通过正则表达式进行模式匹配
一串不包含特殊字符的正则表达式匹配它自己,例如:
cat /etc/passwd | grep joey
cat /etc/passwd | grep ^a
匹配出所有以a开头的行
cat /etc/passwd | grep t$
匹配以t结束的行
^$
匹配没有任何字符的一行
joey@Jarvis:~$ cat /etc/passwd|grep s..d
sys:x:3:3:sys:/dev:/usr/sbin/nologin
cat /etc/passwd | grep ro*t
[6,8] 匹配 6 或者 8
[0-9] 匹配一个 0-9 的数字
[0-9]* 匹配任意长度的数字字符串
[a-z] 匹配一个 a-z 之间的字符
[a-z]* 匹配任意长度的字母字符串
[a-c, e-f] 匹配 a-c 或者 e-f 之间的任意字符
\$、\*
在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出
cut [选项] filename
默认分割符时制表符
选项参数 | 功能 |
---|---|
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列,默认的是制表符“\t” |
-c | 按字符进行分割后加n表示取第几列 比如 -c 1 |
cut -d " " -f 1 cut.txt #切割cut.txt第一列
cut -d " " -f 2,3 cunt.txt #切割cut.txt第二三列
cat cut.txt | grep txt | cut -d " " -f 1 #在cut.txt文件中切割出txt
echo $PHTH | cut -d ":" -f 3- #系变量值中第二个":"开始后的所有路径
ifconfig |grep netmask |cut -d " " -f 10
一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分在进行分析处理
awk [选项] '/pattern1/{action1}' '/pattern2/{action2}...' filename
pattern:表示awk在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项 | 功能 |
---|---|
-F | 指定输入文件分隔符 |
-v | 复制一个用户定义变量 |
cp /etc/passwd ./ #准备数据
awk -F : '/^root/{print $7}'passwd #以root开头的行第七列
awk -F : '/^root/{print $1","$7}' passwd #以root开头的行第2和7列
awk -F : 'BEGIN{print"user,shell"}{print $1","$7}END{print "joey,/bin/joey"}' passwd #在所有行前面添加列名user,shell;最后一行添加joey,/bin/joey
awk -v i=1 -F: '{print $3+i}' passwd #将passwd文件中的用户id增加数值1并输出
变量 | 说明 |
---|---|
FILENAME | 文件名 |
NR | 已读的记录数(行号) |
NF | 浏览记录的域的个数(切割后,列的个数) |
#统计passwd文件名,每行的行号,每行的列数
awk -F : '{print "finename:" FILENAME ",lineum:"NR ",col:"NF}' passwd
#查询ifconfig命令输出结果中的空行所在的行号
ifconfig | awk '/^$/{print NR}'
#切割IP
ifconfig ens33 |awk '/netmask/{print $2}'
每天对指定目录归档备份的脚本,输入一个目录名称,将目录下所有文件按天归档保存,并将归档日期附加在归档文件名上,放在/root/archive下
#!/bin/bash
# 首先判断输入参数个数是否为 1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名"
exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在!"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档目录文件
echo "开始归档..."
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$DEST"
echo
else
echo "归档出现问题!"
echo
fi
exit