[linux]常用命令

Linux

文章目录

安装分区

swap可以先不分,等安装后挂载文件夹作swap

文件系统
/ufi1024MiBext4
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

更改ubuntu tty中字体大小

  1. sudo dpkg-reconfigure console-setup

    • 若设置中出现乱码可尝试更改/etc/default/locale文件为

      #  File generated by update-locale
      LANG="en_US.UTF-8"
      LANGUAGE="en_US:en"               
      
  2. 使用默认的的UTF-8即可

在这里插入图片描述

  1. 选择默认的Guess optimal character set(猜测最佳字符集)即可
    在这里插入图片描述

  2. 这里需要更改TerminusoldTerminus
    在这里插入图片描述

  3. 这里就可以选择字体大小
    在这里插入图片描述

VIM

Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器
在这里插入图片描述

模式之间的转换

i或a或o
ESC
:和/
ESC
V
ESC
普通模式
编辑模式
指令模式
可视模式

普通模式

主要作用:删除、复制、粘贴、移动光标

语法功能描述
yy复制光标当前一行
yawYank 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配置文件

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
systemctl start|stop|restart|status|disable(禁用) 服务名
#在/usr/lib/systrmd/system
systemctl restart NetworkManager
#NetworkManager是network的新版本
运行级别
开机
Bios
/boot
init进程
运行级别
运行级别对应的服务

查看默认级别:vi /etc/inittab

linux系统有7中运行级别(runlevel):常用的是级别3和5

  • **0:**系统关机状态,系统默认运行即被不能设为0,否则不能正常启动
  • 1:单用户工作状态,root权限,用户系统维护,禁止远程登陆
  • 2:多用户状态(没有NFS),不支持网络
  • 3:完全的多用户状态(有NFS),登陆后进入控制台命令模式
  • 4;系统未使用,保留
  • 5:X11控制台,登陆后进入图形GUI模式
  • 6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

运行级别简化为:

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
type 命令
#判断命令是否为系统内置命令
#非系统内置,则会输出命令地址
help
help 命令
#获得shell内置命令的帮助信息


ls --help	#命令 --help
#获得改命令内置的帮助信息
man

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 which:输出/user/bin/which

whereis

查找命令的二进制、源代码和手动页面文件

whereis whereis

whereis: /usr/bin/whereis /usr/share/man/man1/whereis.1.gz

常用快捷键

ctrl+c停止进程
ctrl+l清屏,=clear;彻底清屏是:reset(重新进入)
tab键提示;自动补全
上下键查看执行过的命令

文件目录命令

pwd

print working directory 打印工作目录

显示当前工作目录的绝对路径

pwd [选项]

选项功能
-P查看真实的目录(在软链接里可以跳转的路径)
ls

list 列出目录内容

ls \[选项][目录或是文件]

选项功能
-a全部文件,连同隐藏档(开头为.的文件)一起列出来
-l长数据串列出,包含文件的属性与权限等数据;等价于“ll”
-h以易于阅读的格式输出文件大小(例如1k 23M 2G等)
通常与-s或-l搭配使用
-s以块数形式显示每个文件分配的尺寸
tree

以树状图格式列出目录的内容

tree [选项] 目录

可能需要通过sudo apt-get install tree安装

选项功能
-d只列出目录
-f每个文件都显示的完整路径前缀
cd

Change Directory 切换路径

cd (空格不能省)[参数]

参数功能
绝对路径
相对路径
~或缺省回到该用户的home目录
-回到上次所在的目录
回到当前目录的上一级目录
-P跳转到世纪物理路径,而非快捷方式路径
mkdir

Make directory 建立目录

mkdir[选项]要创建的目录

选项功能
-p递归创建目录
mkdir a b	#相对路径创建两个目录
mkdir /a /b	#根目录下创建两个目录
mkdir -p a/a	#在a目录下创建一个a目录
mkdir -p c/a/a	#创建一个多层目录
rmdir

Remove directory 移除目录

rmdir 要删除的空目录

rmdir c/a/a c/a c
#可简化为
rmdir -p c/a/a
touch

创建空文件

touch 文件名称

touch a.txt
#不带文件后缀名时默认文本文档
cp

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

删除

rm [选项] deleteFile

选项功能
-r递归删除目录中所有内容
-f强制删除操作,而不提示用于进行确认
-v显示指令的详细执行过程
  • 选项可以组合如-rf,-rfv
  • rm -rf /*:清理垃圾,建议在同学电脑上尝试[doge]
mv

移动文件与目录或重命名

mv oldNameFile newNameFile 重命名

mv /temp/movefile /targetolder 移动文件

mv /temp/a.txt /b.txt 移动并重命名文件

cat

catch 查看文件内容,从第一行开始显示

打印文件信息到控制台

cat [选项] 需要查看的文件

选项功能
-n显示所有行的行号,包括空行
more

文件内容分屏查看器

基于VI编辑器

操作功能
空格(space)向下翻一页
Enter向下翻一行
q离开
Ctrl+F跳过未浏览的内容
Ctrl+B返回上一屏
less

查看大文件方便;分页显示文件内容;

less 需要查看的文件路径

操作功能
空格|[pagedown]向下翻动一页
[pageup]向上翻动一页
/字符串查找【字串】,n:向下查找;N:向上查找
q离开less
  • 当输出内容过长,过多时,可以搭配“|less”查看阅读

    ps aux | less
    #分页显示进程信息说明
    
echo

输出内容到控制台

echo\[选项][输出内容]

echo $系统变量

选项:

-e:支持反斜线控制字符转换

控制字符作用
\转义字符
\n换行
\t制表符

echo $双击tab键,查看所有系统变量

echo $举例
echo $PATH环境变量
echo $HOSTNAME主机名
echo $USER用户名
head

显示文件开头部分内容,默认情况下显示文件的前10行内容。

head [选项] 文件

head -n 5 文件 查看文件前5行内容

选项功能
-n<行数>指定显示头部内容的行数
tail

输出文件尾部内容,默认情况下显示文件的后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

ln

link 链接

ln -s 源文件或目录 目标目录和软链接名:软链接(创建一快捷方式)

ln 文件名 源文件:硬链接(比软链接更底层,映射一个文件,只能针对文件)

  • 硬链接:inode指向源文件在硬盘中的区块,与普通文件一样。源文件删除或移动后仍可以用硬链接访问。只有当该文件的硬链接数量为0时,才是真正意义上的删除
  • 软链接:保存了其代表文件的路径,访问时替换自身路径。源文件删除或移动后软链接实效。

删除:

删除作用
rm -rf 软链接名删除软链接
rm -rf软链接名/删除软链接对应的真实目录下的所有文件
ln -s /home/lf/a.txt /home/lf/桌面/a	#在桌面链接../a.txt
#源文件设置为绝对路径后才能保证软链接可移动到其它目录
history

历史命令

命令作用
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.comwindows
cn.ntp.org.cnNTP授时快速域名服务
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 用户名:添加新用户

useradd -g 组名 用户名:添加新用户到某个组

adduser 用户名:perl脚本,添加新用户同时配置用户其他信息

除了root外用户都默认在/home/下

useradd -d /home/dave david
#创建一个叫david的用户,他的用户文件夹名叫dave

userdel

删除用户

sudo deluser <username>

sudo deluser --remove-home <username>
#删除用户及其著目录和邮件假脱机

sudo userdel -r <username>
#删除用户的同时删除用户对应的目录

id

查看用户

id 用户名

用户id 组id 组

cat /etc/passwd

查看存在的用户

passwd

设置用户密码

passwd 用户名

su

switch user 切换用户

su 用户名

su|su -切换root用户

root切换其他用户不需密码

who

who am i最初创建这个会话的用户
whoami当前会话的用户
who当前登陆的用户及登陆的tty

exit

退出当前用户

sudo

普通用户的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
  • 第一个ALL是允许的用户
  • 第二个ALL是主机
  • 第三个ALL是运行命令时的用户
  • 最后一个是允许的命令

usermod

修改用户组

usermod [选项] 用户组 用户名

选项功能
-g修改用户的初始登陆组,给定的组必须存在。默认组id是1.
-fn天数后,设定密码为失效状态
-L锁定该用户

用户组

默认情况下一个用户一个组

/etc/group

查看存在哪些组

groupadd

新增组

groupadd 组名

groupdel

删除组

groupdel 用户名

groupmod

选项功能
-n重命名
groupmod -n 旧名 新名

文件权限

文件类型属性权限属组权限其他用户权限
0123456789
d(文件)
l(链接)
rwxrwxrwx
目录文件执行执行执行
-rw-------  1 lf   lf   10168  6月 26 18:48  .viminfo
#文件类型权限	链接数	所属者	所属组	文件大小	最后一次更改时间	文件名
  • 查看文件:链接数指的是硬链接个数
  • 查看文件夹:链接数值的是自文件夹个数

复制粘贴移动文件后一般文件权限不会改变

rwx

  1. 作用到文件
    • r:read,可以读取,查看
    • w:write,可以修改,但不可以删除该文件删除一个文件的前提条件是对该文件所在的目录是有写权限,才能删除该文件
    • x:execute,可以被系统执行
  2. 作用到目录
    • r:read,可以读取,ls查看目录内容
    • w:write,可以修改,目录内创建+删除+重命名目录
    • x:execute,可以进入该目录

chmod

a
all
u
user
g
group
o
other
文件类型属性权限属组权限其他用户权限
0123456789
d(文件)
l(链接)
rwxrwxrwx
目录文件执行执行执行

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
4r–
5r-x
6wr-
7wrx
chmod 777 a.txt
#将a.txt设置为全部用户可读、写、执行,即rwxrwxrwx

chmod -R 644 a
#文件a及文件a中所有权限改为rwxrw-rw-

chown

改变文件和目录所有者

chown [选项][用户][文件或目录]

选项功能
-R递归
chown a.txt test
#把a.txt的所属者改为test

chgrp

改变所属组

chgrp [用户][文件或目录]

chgrp a.txt test
#把a.txt的所属组改为test

搜索查找

find

将从指定目录向下递归地便利各个子目录,将满足条件的文件显示在终端

find [搜索范围] [选项]<具体要求>

选项功能
-name<查询方式>按照制定的文件名查找模式查找文件
-user<用户名>查找数据指定用户名所有文件
-seze<文件大小>按照指定的文件大小查找文件,单位为:
b——块(512字节)
c——字节
w——字(2字节)
k——千字节
M——兆字节
G——吉字节
find / -name "*.txt"
#查询根目录下以.txt结尾的文件

find / -size +10M
#查询根目录下大于10M的文件

grep 及“|”

grep,过滤查找

”|“,管道符,将前一个命令的处理结果输出给传递给后面的命令处理

grep选项功能
-n输出的同时打印行号
grep -n boot test.txt
#查找并输出test.txt文件中含有boot的行(包括行号)

wc

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/gunzip

gzip 文件:将文件压缩为.gz文件

gnzip 文件.gz:解压

  1. 只能压缩文件,不能压缩目录
  2. 不会保留原来的文件

zip/unzip

zip [选项] 压缩后的文件名和目录 文件地址:压缩文件和目录

unzip -d 将解压后的文件名地址 文件地址:解压缩文件

zip选项功能
-r压缩目录
unzip选项功能
-d<目录>指定解压后文件的存放目录
  1. 在windows/linux通用
  2. 可压缩目录并且可以保留源文件

tar

打包目录,压缩后的文件格式.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/]

磁盘管理

du

disk usage 查看文件和目录占用的磁盘空间

du 目录或文件 显示目录下每个子目录的磁盘占用情况

选项功能
-h以人们可读的格式输出大小(例如,1K 234M 2G)
-a输出所有文件的磁盘用量,不仅仅是目录
-c显示总计信息
-s只分别计算命令列中每个参数所占的总用量
–max-depth=n指定统计子目录的深度为第n层
du -sh
#查看当前目录占用大小

df

disk free 空余磁盘

df [选项] 目录 列出文件系统的整体磁盘使用量,检查文件系统的词阿婆弄空间占用情况

选项功能
-h以人们可读的格式输出大小(例如,1K 234M 2G)

free

内存的使用情况

free

free -h
#			物理			占用						共享			缓存
               total        used        free      shared  buff/cache   available
内存:       14Gi       4.6Gi       7.3Gi       274Mi       3.1Gi       9.8Gi
交换:       15Gi          0B        15Gi

lsblk

列出块设备的信息

lsblk [选项] [<设备> …]

选项功能
-f输出文件系统信息

mount/umount 挂载/卸载

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).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / 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

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
UUID			挂载点			文件系统类型		选项		是否开启kdump(备份)	文件系统检查的优先级

fdisk

分区

fdisk [选项] 硬盘设备名:对新增硬盘进行分区操作

选项功能
-l显示所有硬盘的分区列表

进程管理

ps

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的状态

kiil

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

查看进程树

pstree [选项]

选项功能
-p显示进程的PID
-u显示进程的所属用户

top

top [选项] 实时监控系统进程状态

选项功能
-d 秒数指定top命令每隔几秒更新。默认是3秒在top命令的交互模式当中可以执行的命令
-i使top不显示任何闲置或僵死进程
-p (pid)通过指定监控进程ID来仅仅监控某个进程的状态
操作功能
P以CPU使用率排序,默认选项
M以内存的使用率排序
N以PID排序
u查找某个用户的进程
kkill某个进程
q退出top

netsat

显示网络状态和端口占用信息

netstat -anp|grep 进程号 查看该进程网络信息

netstat -nlp|grep 端口号 查看网络端口号占用情况

选项功能
-a显示所有正在监听(listen)和未监听的套接字(socket)
-n拒绝显示别名,能显示数字的全部转化为数字
-l仅列出在监听的服务状态
-p表示显示那个进程在调用

crontab 系统定时任务

服务管理

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'文件

软件管理

RPM

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	#安装前不检查依赖

apt

Advanced Packaging Tool apt [可选项] [操作] [包名]

可选项有-h帮助,-y安装过程全部选择都为“yes”,-q不显示安装过程

操作功能
update从配置的源下载包信息
upgrade从配置的源安装当前系统中的所有包的可用升级
full-upgrade执行升级功能,如果需要将系统升级到新的版本,则会删除当前已安装的包
install安装一个或多个指定的包
remove删除包,但是会保留包的配置文件
purge删除包的同时删除其配置文件;不要对不熟悉的包运行这个
autoremove删除自动安装的包,这些包是为了满足其他包的依赖关系而自动安装的,随着依赖关系的更改或需要它们的包已被删除,这些包现在不再需要了
search在可用包列表中搜索给定的项并显示匹配到的内容
show显示关于给定包的信息,包括它的依赖关系、安装和下载大小、包的来源、包内容的描述等等
list显示满足特定条件的包列表,默认列出所有的包
sudo apt edit-sourcesedit-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	#升级软件

dpkg

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 # 配置包

yum

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

是一个在终端上显示带有发行徽标的系统信息工具,neofetch命令将显示有关相应系统的简要信息。 显示的信息包括: 型号、操作系统、内核、CPU、GPU、内存、正常运行时间、程序包、shell、分辨率、DE、WM、WM主题、主题、图标和终端等

#下载
sudo apt install neoretch

#使用
neofetch

ffmpeg

开源的音视频播放软件

ffplay xxx.mp4

sudo apt install ffmpeg
#若无法下载成功,请尝试换阿里源

copyq

剪切板

可记录图片

sudo apt install copyq

p7zip

开源的数据压缩程式

系统自带的就已经够用了,不用下,.7z文件也能解压

sudo apt install p7zip

aria2

sudo apt install aria2 -y

aria2c url
#基础下载

aria2c -o name.type url
#下载后改名

aria2c -Z url url
#多个文件

aria2c -bt-tracker=url
#磁力链接下载

dd

读取、转换并输出数据

sudo fdisk -l
#查看u盘设备如“/dev/sda”等

sudo umount /dev/sda
#卸载U盘
#地址由实际情况决定

sudo dd if=xxx.iso of=/dev/sda
#制作启动盘
#地址由实际情况决定

zerotier-one

内网穿透工具

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

ssh

可以远程操作机器

#下载
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 可递归

kvm

是一种用于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 镜像并且按照下面的步骤来创建你的虚拟机:

  1. 在搜索栏输入“Virtual Machine Manager”并且点击图标来启动应用。

  2. 在应用启动后,从顶部菜单点击“File” -> “New Virtual Machine”:

  3. 一个新窗口将会显示。选择 “Local install media” 并且点击 “Forward” 按钮。

  4. 提供你的 ISO 镜像路径,并且点击 Forward 按钮。

  5. 在下一个屏幕,选择虚拟机 VM 的内存和 CPU 设置。点 Forward。

  6. 下一步,选择“Create a disk image for the virtual machine” 并且选择虚拟机的磁盘空间大小。点击 Forward。

  7. 输入你的虚拟机名字并且点击 “Finish”。

  8. 虚拟机启动,并且一个新窗口将会打开:

从这里,你就可以按照屏幕的操作,去完成操作系统的安装。

一旦操作系统被安装好,你可以从virt-manager去访问它,使用 ssh 或者使用 Serial Console

wine

提供兼容层来将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

mysql

[推荐阅读][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

tomcat

先占位[doge]

ubuntu wls与win文件互通
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

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!'

执行

  1. 采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)

    sh hello.sh
    bash hello.sh
    #把文件当作参数传入
    #另起一个sh或bash的进程执行命令
    
  2. 先赋予脚本权限

    chmod +x hello.sh
    ./hello.sh
    #单独嵌套一个shell
    
  3. 直接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
#系统定义的全局变量

自定义变量

  1. 基本语法

    • 定义:变量名=变量值,=后不能有空格
    • 撤销:unset 变量名
    • 静态变量:readonly变量
    • export 变量名:export my_var
  2. 变量定义规则

    • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
    • 等号两侧不能由空格
    • 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
    • 变量的值如果有空格,需要使用双引号或单引号括起来
  3. 例子

    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
  1. 基本语法

    $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

条件判断

基本语法

  1. test condition

    joey@Jarvis:~$ a=1
    joey@Jarvis:~$ test $a = 1;echo $?;
    0		#true
    joey@Jarvis:~$ test $a = 2;echo $?;
    1		#false
    
  2. [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
    

常用判断条件

  1. 两个整数之间比较

    含义
    -eqequal等于
    -nenot equal不等于
    -ltless than小于
    -leless equal小于等于
    -gtgreater than大于
    -gegreater equal大于等于

    如果是字符串之间的比较,用等号“=”判断相等;用“!=”判断不等

  2. 按照文件权限进行判断

    含义
    -rread有读的权限
    -wwrite有写的权限
    -xexecute有执行的权限
  3. 按照文件类型进行判断

    含义
    -eexistence文件存在
    -ffile文件存在并且是一个常规的文件
    -ddirectory文件存在并且是一个目录
  4. 多条件判断

    &&表示前一条命令执行成功时,才执行后一条命令

    ||表示上一条命令执行失败后,才执行吓一条命令

流程控制

if

单分支
if [ 条件 ];then
	#程序
 fi
 
#或者

if [ 条件 ]
then 
	#程序
fi
多分枝
if [ 条件 ]
then
	#程序
elif [ 条件 ]
then
	#程序
else
	#程序
fi
  1. [ 条件 ],中括号和条件之间必须有空格
  2. if后要有空格
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

case 变量 in
"值1")
	#变量=值1时,程序
;;
"值2")
	#变量=值2时,程序
;;
"值3")
	#变量=值3时,程序
;;
*)
	#default,程序
;;
esac
  1. case行尾必须为单词in,每个模式匹配必须以右括号结束
  2. 双分号;;表示命令序列结束,相当于java中的break
  3. 最后的*)表示默认模式,相当于java中的default
joey@Jarvis:~$ cat case.sh
#!/bin/bash
#输入一个字符,1,返回"你好";2,返回"hello";其他返回default;
case $1 in
"1")
        echo "你好"
        ;;
"2")
        echo "hello"
        ;;
*)
        echo "default"
        ;;
esac

for

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… 4n的形式输出所有参数

当他们被双引号包含时,$*会将所有的参数作为一个整体,以“$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

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读取控制台输入

read [选项] (参数)
  1. 选项

    -P:指定读取值时的提示符

    -t:只当读取值时的等待的事件

  2. 参数

    指定读取值的变量名

joey@Jarvis:~$ cat read.sh
#!/bin/bash
#提示7秒内,读取控制台输入的名称
read -t 7 -p "Enter your name in 7 seconds:" Name
echo $Name

函数

系统函数

basename

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 文件绝对路径

从给定的包含绝对路径的文件名中取出文件名(非目录的部分),然后返回剩下的路径(目录的部分)

dirname 可以理解为取文件路径的绝对路径名称

joey@Jarvis:~$ dirname /home/joey/for.sh
/home/joey

自定义函数

[ function ] funname[()]
{
	Action;
	[return int;]
}
  1. 必须在调用函数地方之前,先声明函数,shell脚本时逐行运行。不会向其它语言一样先编译
  2. 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为返回值。return后数值返回[0,255]
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
*,出现0次或多次
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命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出

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

一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分在进行分析处理

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并输出
awk的内置变量
变量说明
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
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值