前言
本文为笔者按照自身使用频率整理的linux笔记
文章目录
1.1 简介
什么是操作系统
- 操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石;
- 操作系统本质上是运行在计算机上的软件程序 ;
- 为用户提供一个与系统交互的操作界面 ;
- 操作系统分内核与外壳(我们可以把外壳理解成围绕着内核的应用程序,而内核就是能操作硬件的程序)。
什么是Linux
-
类Unix系统: Linux是一种自由、开放源码的类似Unix的操作系统
-
Linux内核: 严格来说,Linux这个词本身只表示Linux内核
-
Linux之父:一个编程领域的传奇式人物。他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者,是当今世界最著名的电脑程序员、黑客之一。他还发起了Git这个开源项目,并为主要的开发者。
-
Linux遵循 Unix的
everything is file
的概念,无论是网络设备、硬盘、声卡等都视为一个文件 -
1991年,芬兰的业余计算机爱好者Linus Torvalds编写了一款类似Minix的系统(基于微内核架构的类Unix操作系统)被ftp管理员命名为Linux 加入到自由软件基金的GNU计划中;
-
Linux以一只可爱的企鹅作为标志,象征着敢作敢为、热爱生活。
Linux分类
Linux根据原生程度,分为两种:
- 内核版本: Linux不是一个操作系统,严格来讲,Linux只是一个操作系统中的内核。内核是什么?内核建立了计算机软件与硬件之间通讯的平台,内核提供系统服务,比如文件管理、虚拟内存、设备I/O等;
发行版本: 一些组织或公司在内核版基础上进行二次开发而重新发行的版本。Linux发行版本有很多种(ubuntu和CentOS用的都很多,初学建议选择CentOS),如下图所示
Vmware还是VirtualBox
Vmware
许多 Linux 发行版直接提供了 open-vm-tools 和 open-vm-tools-desktop 软件包,这使得虚拟机添加件可以直接通过发行版自己的仓库安装,稳定,随意升级。VMware 官方的 VMware Tools 第一句话就是,不建议你安装光盘中的 Tools,而是使用 open-vm-tools。
Vmware虚拟网卡用起来更方便,即便是在NAT模式下,主机和虚拟机也可以顺利建立连接,VirtualBox下就比较麻烦。
Vmware显卡性能更好些,基本上能提供接近真机的体验。
图形界面有问题什么的,安装open-vm-tools,不要安装vmware提供的
1.2 网络
1.2.1 网络连接方式
- **Bridged ** 桥接模式(推荐): 同事关系,地位平等
VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信,虚拟系统和宿主机器的关系,就像连接在同一个Hub(多端口转发器)上的两台电脑。- NAT 网络地址转换模式: 下属关系,用宿主的资源连网
虚拟系统借助NAT的功能,通过宿主机所在的网络来访问公网。在这种模式下宿主机成为双网卡主机,同时参与现有的宿主局域网和新建的虚拟局域网,但由于加设了一个虚拟的NAT服务器,使得虚拟局域网内的虚拟机在对外访问时,使用的则是宿主机的IP地址,这样从外部网络来看,只能看到宿主机,完全看不到新建的虚拟局域网。- **Host-only ** 仅主机模式: 小三关系,新开辟的局域网
新建了一个由所有虚拟机与宿主机所构成的局域网,但该局域网与宿主机本身所处的现有局域网是相互独立的,如果不做额外路由设置,这两个局域网之间不会连通,因此新建的局域网可以认为是一个单独从属于当前宿主机的私有网络,其成员为当前宿主机和相关的所有虚拟机。
1.2.2 获取可用IP以及所在网段
首先,配置动态ip,让它自动分配一个可用的ip
#修改网卡配置文件,根据机器的版本等不同,名称不一定是ifcfg-enp0s3
vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
# 修改文件内容:
ONBOOT=yes
#保存退出后,重启网络,以让linux重新读取配置文件
systemctl restart network #centos6下是service network restart
#查看新的ip
ip addr #centos6下是ifconfig
ip addr
的内容中 ,ens33
网卡没有出现 inet
,只有 inet6
1.2.3 虚拟机桥接虚拟网卡
- 虚拟机设置网络设置
2.编辑–虚拟网络适配器中,手动指定桥接的网卡
3.该网卡最好是一个虚拟网卡(搜索如何配置 Windwos
虚拟网卡),在可以上网的网卡上,设置对该虚拟网卡的共享
注意,当可以联网的那个网络连接更改了ip后,需要重新设置网络共享。
此时,可以先把可上网的连接取消虚拟网卡的共享,然后禁用–启用,再绑定虚拟网卡共享即可
如果网络实在不能联网,cmd输入ipconfig查看主网的ip,然后手动调整虚拟网卡的ipv4地址和网关为同一网段
否则此时无法联网,yum也会 [Errno 14] curl#6 - "Could not resolve host: mirrors.
1.2.4 配置静态IP
网关配置文件:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 网络类型为以太网
TYPE=Ethernet
# 网卡设备名,设备名一定要跟文件名一致
DEVICE=ens33
# 手动分配ip 可配置为dhcp动态分配ip后使用static固定ip便于xsehll连接
BOOTPROTO=static
# 该网卡是否随网络服务启动
ONBOOT=yes
# 该网卡ip地址
IPADDR=192.168.137.100
# 子网掩码
NETMASK=255.255.255.0
# 网关 一般是当前网段.1
GATEWAY=192.168.137.1
# DNS,8.8.8.8为Google提供的免费DNS服务器的IP地址
DNS1=8.8.8.8
#UUID是当前虚拟机在局域网的唯一标识,可以删掉,以免克隆的时候出现问题
#IPV6相关的设置用不到可以去掉
如果配置后不生效:
#配置网络为工作状态,避免某些情况下此处被设置为no影响访问网络
vi /etc/sysconfig/network
NETWORKING=yes # 网络是否工作,此处一定不能为no
source /etc/sysconfig/network
#配置公共DNS服务
vim /etc/resolv.conf
nameserver 8.8.8.8
关闭并禁用防火墙(否则后续学习时各不同需要逐个开启端口很麻烦),然后重启网络服务
#临时关闭防火墙
systemctl stop firewalld
#禁止防火墙开机自启
systemctl disable firewalld
#重启网络服务,使网关配置文件生效
systemctl restart network
#注意:除了linux的阻拦之外,windows上也要允许linux访问,我直接开启了“文件和打印共享”,然后就可以在linux中ping通windwos了。如果不行可继续思考windows防火墙,具体 可参考https://blog.csdn.net/DTFT_/article/details/104936264
1.2.5 配置DNS
配置DNS
检查NetManager的状态:systemctl status NetworkManager.service
检查NetManager管理的网络接口:nmcli dev status
检查NetManager管理的网络连接:nmcli connection show
设置dns:nmcli con mod ens33 ipv4.dns "114.114.114.114 223.5.5.5"
让dns配置生效:nmcli con up ens33
注意当dns生效时
使用shell连接虚拟机时ssh的服务端在连接时会自动检测dns环境是否一致,会导致shell的连接非常慢,此时可以
1.执行vi /etc/ssh/sshd_config把UseDNS yes,改为UseDNS no
2.重启SSHD服务 systemctl restart sshd 或 service sshd restart
之后实测秒连
1.2.6 校验网络连通性
ping www.baidu.com
curl -v https://xxx:8899 -d "name=zhangsan"
https://www.ruanyifeng.com/blog/2019/09/curl-reference.html
增加header: -H "xxx"
curl参数传递json:
1.json数据中的双引号需要加反斜杠()来转义(csdn插件可一键转义)
2.json数据需要双引号括起来
3.参数最外层可不加引号,但是json数据中间不能有空格。
curl发送POST请求
curl -d'login=emma&password=123'-X POST https://google.com/login
或
curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login
#检测能否连通指定ip的指定端口
telnet 10.61.6.6 1555
#可以打印出完整的路由情况
traceroute 10.61.6.6 1555
1.2.7 防火墙
#1查看防火状态
systemctl status firewalld
service iptables status
#2:暂时关闭防火墙
systemctl stop firewalld
systemctl stop firewalld.service
service iptables stop
#3:永久关闭防火墙
systemctl disable firewalld
chkconfig iptables off
#4:重启防火墙
systemctl enable firewalld
service iptables restart
如果网络已经按照如上配置还不通,尝试把虚拟网卡和共享网络给虚拟网卡的那个网卡都重启一下,再尝试
1.3 文件结构、用户和用户组
1.3.1 核心目录介绍
- /bin: 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里;
- /etc: 存放系统管理和配置文件;
- /etc/default/ 这个目录中放置很多服务默认的配置文件
- /etc/systemd/system/ 这个目录中主要的文件都是指向 /lib/systemd/system/ (Ubuntu)(usr/lib/systemd/system(Centos))目录中的链接文件
- /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示;
- /usr : 用于存放系统应用程序;
- /opt :额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;
- /proc :虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
- /root : 超级用户(系统管理员)的主目录(特权阶级);
- /run: 这个目录放置了好多服务运行时的临时数据,比如 lock file 以及 PID file 等等
- /run/systemd/system/ 系统运行过程中产生的脚本,比如用户相关的脚本和会话相关的脚本。
- /sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;
- /dev: 用于存放设备文件;
- /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
- /boot:存放用于系统引导时使用的各种文件;
- /lib : 存放着和系统运行相关的库文件 ;
- /lib/systemd/system/ 大多数 unit 的配置文件都放在这个目录下
- /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
- /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
- /var/lib/ 一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中,比如 docker 相关的数据文件就放在这个目录下
- /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。
如果希望某一个脚本可在某用户下的任意目录被方便地执行,可以将其放在当前用户的home主目录下。如 a.sh
在 /home/apq
下且有 x
权限,则可在 apq
用户下任意位置 使用 ~/a.sh
执行脚本
如果想迁移主目录,要将 /home/apq 下的隐藏文件(ls -la)挪到新的目录下,并且修改 /etc/passwd 中的 apq用户的对应主目录改为新目录
1.3.2 用户管理
相关文件
/ect/passwd #保存用户信息
`用户名:密码(x为占位符):用户id:组id:用户说明:用户的主目录:用户使用的shell环境(默认为bash)`
root用户(根用户、管理员账户、超级用户) (root用户的id为0)
系统用户 UID:1-999(centos7版本)
普通用户 UID:1000+
/ect/shadow #保存用户密码
如:root:I.m1XoRd0W8Pc7C........Phodj8ZM1: :0:99999:7: : :
1 root: 用户名
2 I.m..M1: 被加密后的密码
3 最近修改密码的日期
4 0:密码不能更改的天数,0表示随时可以修改
5 99999:密码过期时间
6 7:密码需要更改期限到来前7天发出警告
7 宽限天数,密码过期几天后还能改密码
8 账号过期时间
9 保留
/ect/group #保存组信息
/etc/gshadow #保存组的密码信息
/etc/sudoers #可用于为用户添加sudo权限
初始化涉及文件
/etc/skel目录是用来存放新用户配置文件的目录,当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户的家目录下:默认情况下,/etc/skel目录下的所有文件都是隐藏文件(以.点开头的文件);通过修改、添加、删除/etc/skel目录下的文件,我们可为新创建的用户提供统一的、标准的、初始化用户环境。
/etc/login.defs:用来定义创建用户时需要的一些用户的配置信息,如创建用户时是否需要家目录,UID和GID范围,用户及密码的有效期限等
/etc/default/useradd文件:是在使用useradd添加用户时的一个需要调用的一个默认的配置文件,可以使用 “useradd -D 参数”,这样的命令格式来修改文件里的内容。
创建用户涉及的操作
1.在/etc/passwd中添加用户信息
2.如果使用passwd命令创建密码,则将密码加密保存在/etc/shadow中
3.为用户建立一个新的家目录/home/zhangsan
4.将/ect/skel中的文件复制到用户的家目录中
5.建立一个与用户名相同的组,新建用户默认属于这个同名组
主要命令
- 添加用户账号实际上是保存在/etc/passwd文本文件,内容格式:
root用户(根用户、管理员账户、超级用户) (root用户的id为0) 系统用户 UID:1-999(centos7版本) 普通用户 UID:1000+
- 只有管理者可以更改指定用户密码,一般用户只能变更自己的密码
#添加用户账号 useradd 选项 用户名 -p encryptedPassword : 加密后的密码, 方法crypt()的返回值. 获取明文密码ftq的加密后密文的案例: passwordText=ftq encryptedPassword=$(perl -e 'print crypt($ARGV[0], "password")' $passwordText) echo encryptedPassword -g groupName 组名 指定用户所属的组 创建ftq用户,所属组为ftq,密码为ftq useradd ftq -g ftq -p $(perl -e 'print crypt($ARGV[0], "pas0], "password")' 'ftq') #删除用户帐号 userdel 选项 用户名 #修改用户的组、权限等等 usermod 选项 用户名 -c<备注> 修改用户帐号的备注文字。 -d登入目录> 修改用户登入时的目录。 -e<有效期限> 修改帐号的有效期限。 -f<缓冲天数> 修改在密码过期后多少天即关闭该帐号。 -g<群组> 修改用户所属的群组。 -G<群组> 修改用户所属的附加群组。 -l<帐号名称> 修改用户帐号名称。 -L 锁定用户密码,使密码无效。 -s<shell> 修改用户登入后所使用的shell。 -u<uid> 修改用户ID。 -U 解除密码锁定。 #查看用户信息 w :显示有哪些用户已经登录并且在干什么 who :显示有哪些用户已经登录系统 whoami :显示当前用户 id :查看用户 #修改密码 ##更改或创建用户的密码 passwd 用户名 ##显示用户账号密码信息 passwd -S 用户名 ##清除用户密码 passwd -d 用户名 #切换用户 su - 用户名 su 用户名 su - 或直接 su ##这样写默认视为切换到root
1.3.3 用户组
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新
#增加一个新的用户组 groupadd 选项 用户组 #要删除一个已有的用户组 groupdel 用户组 #修改用户组的属性 groupmod 选项 用户组
/etc/shadow字段作用
如:root:I.m1XoRd0W8Pc7C........Phodj8ZM1: :0:99999:7: : : 1 root: 用户名 2 I.m..M1: 被加密后的密码 3 最近修改密码的日期 4 0:密码不能更改的天数,0表示随时可以修改 5 99999:密码过期时间 6 7:密码需要更改期限到来前7天发出警告 7 宽限天数,密码过期几天后还能改密码 8 账号过期时间 9 保留 #userad
1.4 文件命令
1.4.1 学习命令
- xxx --help
- man
- 中文man手册
1.4.2 文件搜索
find
find 查找路径 -name 要查找的文件名
#从当前目录及所属下级目录递归查找指定文件名的文件,并输出这些文件的位置
find . -name banner.txt
从demo.txt menu.c两个文件中,不分大小写地过滤出包含“hello”所在
grep
#查找当前目录(及子目录)下所有文件中的文本
grep "text" * -nR
#从结果中过滤掉不包含ind的行
grep -v ind
#从结果中过滤出包含ind的行
grep ind
#从结果中过滤出包含ind的行,并同时输出上下10行
grep -C 10 ind
#从结果中过滤出包含ind的行,并同时输出上面10行
grep -B 10 ind
#从结果中过滤出包含ind的行,并同时输出下面10行
grep -A 10 ind
1.4.3 文件查看/编辑/过滤
cat 只显示最后一屏内容
more 显示百分比 回车下一行,空格下一页,q退出
less PgUP向上翻页,PgDn向下翻页,q退出
head -10 查看文件的前10行 Ctrl+C结束
tail -10 查看文件的后10行 Ctrl+C结束
tail -f 文件名 可以对某个文件进行动态监控
wc 文本统计
wc -l 统计行数
复制粘贴乱码:
vim a.yaml
esc :set paste
粘贴或者i o a等
esc :set nopaste解除粘贴模式
文本过滤
Sed
#1.文件内的文本替换
sed -i 's/old/new/g' name.txt
文件内 vim esc 冒号
%s/old/new/g
g是全局的意思,不加就只会替换第一个
#2.针对指定文件的文本替换
#3.日志时间段过滤
sed -n '/开始时间日期/,/结束时间日期/p' all.log
1.4.4 文件压缩与传输
tar
tar解压后会直接覆盖掉同名文件,为避免此问题,一定要在解压时指定目录
#tar本身不具有压缩功能。他是调用压缩功能实现的
## GZ
#打包并压缩文件
#c create z gzip/ungzip f
# -z, --gzip, --gunzip, --ungzip filter the archive through gzip
# -Z, --compress, --uncompress filter the archive through compress
tar -zcf 压缩文件名.tar.gz 被压缩文件名
#将多个文件放到一个压缩包内
tar -zcf 压缩文件名.tar.gz 被压缩文件名1 被压缩文件名2 .....
#解压到指定目录 解压后的文件会直接覆盖掉同名文件
tar -zxf 压缩文件名.tar.gz -C /usr/local
tar xf 压缩文件名.tar.gz -C /usr/local
#查阅tar包内有哪些文件
tar -ztvf log.tar.gz
#压缩完成后删除原文件 --remove-files
tar -zcf 压缩文件名.tar.gz 被压缩文件名 --remove-files
## BZ
#压缩比率较tgz大,即压缩后占用更小的空间,使得压缩包看起来更小。但同时在压缩,解压的过程却是非常耗费CPU时间。
#压缩
#-j, --bzip2 通过bzip2压缩的形式对文件进行归档
tar -jcvf examples.tar.bz2 examples (examples为当前执行路径下的目录)
举例:
tar -jcvf file.tar.bz2 dir #dir目录
#解压
tar -jxvf examples.tar.bz2 (解压至当前执行目录下)
tar -jxvf examples.tar.bz2 -C /path (/path 解压至其它路径)
举例:
tar -jxvf file.tar.bz2
tar -jxvf file.tar.bz2 -C /temp
unzip 压缩包文件名
unzip 压缩包文件名 -d 解压路径
scp
SCP [-P xxxx] 要传输的文件 目标用户@目标IP:目标位置
SCP [-P xxxx] -r 要传输的文件夹 目标用户@目标IP:目标位置
1.如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:
scp -P 4588 remote@www.runoob.com:/usr/local/sin.sh /home/administrator
2.使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。
lrzsz
rz 上传文件
rz -be 以二进制形式上传文件
sz 文件名 下载指定文件
如遇上传失败,可以使用root用户尝试,当前目录对于当前用户而言可能无权限创建文件或目录
cp
copy file 文件或目录的复制
cp [options] source dest
cp [options] source directory
cp [options] source1 source2... directory
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件
#如果希望安全且完整地复制文件夹
cp -ia redis redisNew
1.4.5 文件安装
RPM
以一种数据库记录的方式来将你所需要的套件安装到你的Linux 主机的一套管理程序。 也就是说,你的linux系统中存在着一个关于RPM的数据库,它记录了安装的包以及包与包之间依赖相关性。 RPM包是预先在linux机器上编译好并打包好的文件,安装起来非常快捷。 但是也有一些缺点,比如安装的环境必须与编译时的环境一致或者相当;包与包之间存在着相互依赖的情况;卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。 每一个rpm包的名称都由”-“和”.”分成了若干部分。
通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到下表所示的目录中
安装路径 | 含 义 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
rpm -ivh xxx.rpm
#基本参数
-i:安装(install);
-v:显示更详细的信息(verbose);
-h:打印 #,显示安装进度(hash);
#rpm升级选项
-U(大写)选项的含义是:如果该软件没安装过则直接安装;若没安装则升级至最新版本。
-F(大写)选项的含义是:如果该软件没有安装,则不会安装,必须安装有较低版本才能升级。
-e 卸载(erase)
#依赖调整参数
-nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
-replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
-replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
-force:强制安装。不管是否已经安装,都重新安装。也就是 -replacefiles 和 -replacepkgs 的综合。
-test:测试安装。不会实际安装,只是检测一下依赖性。
-prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。
#查询已安装内容
-q:查询软件包是否安装
-qa:查询系统中所有安装的软件包
-qi:查询软件包的详细信息
-ql:命令查询软件包的文件列表
-p 选项表示查询未安装的软件包信息,是 package 的首字母(此时因未安装,包需要使用绝对路径)
-qf:命令查询系统文件属于哪个RPM包
-qR:查询软件包的依赖关系(requires)
yum
yum所使用的的源文件在目录 /etc/yum.repos.d
下的 reop
文件中
yum list [包名]
yum search 关键字
yum info 包名
#安装
yum [-y] install 包名
#一次性安装多个
yum install softa softc softd
yum -y update [包名]
yum remove 包名
yum clean all 清空yum缓存
yum makecache 生成yum缓存
1.4.6 文件空间占用
df -lh:查看磁盘剩余空间
df -h:查看每个根路径的分区大小
du --max-depth=1 -lh 仅统计当前目录及一级子目录的大小(0-->1-->2依次变深)
du -sh [目录名]:返回该目录的大小
du -sm [文件夹]:返回该文件夹总M数
du -h [目录名]:查看指定文件夹下的所有文件大小(包含子文件夹)
free -m 查看内存剩余大小
如何删除文件test.log:
echo "">test.log 清空文件,可以立即释放空间
rm test.log 删除文件
针对删除的文件,如有其他进程在使用文件,将不会真正删除,此时文件会被标识为deleted,其他进程不使用后才真正删除并释放空间
查看还使用着删除文件的进程:
lsof|grep deleted
如何批量kill掉还占用着deleted的进程,释放空间
lsof | grep deleted | grep -v grep | awk '{print "kill "$2}' | sh
#清除缓存
echo 3 > /proc/sys/vm/drop_caches
1.4.7 文本重定向
https://blog.csdn.net/jiangyu1013/article/details/81476184
0、1和2分别表示标准输入、标准输出和标准错误信息输出
管道
管道
|
会将左边的输出作为右边的“输入”,一般在右边加grep xxx
用于从左侧结果中匹配xxx
字符串管道也可和
more
、less
等连用一条命令可以使用多次管道
Vim
http://c.biancheng.net/view/805.html
- 命令模式
用vim 打开一个文件刚开始进入的就是命令模式,在这个模式下我们可以控制光标的移动,字符,字或者行的删除,移动复制某段区域,在该模式下可以进入插入模式也可进入底行模式。
- 编辑模式
在编辑模式下才可以插入文字,按Esc进入底行模式.
- 底行模式
在底行模式下保存文件或者退出vim
1.移动光标
1.vim 可以使用小写英文字母 h j k l 分别控制光标左 下 上 右移动,也可以使用箭头
2.Ctrl+b 屏幕往后移动一页
3.Ctrl+f 屏幕往前移动一页
4.Ctrl+u 屏幕往后移动半页
5.Ctrl+d 屏幕往前移动半页
6.gg 进入到文本的开始
7.Shift+g == G 移动到文章的最后
8.Shift+4 == $ 移动到光标所在行的行尾
9.Shift+6 == ^ 移动到光标所在行的行首
10.w 光标跳到下个字的开头
11.e 光标跳到下个字的字尾
12.b 光标回到上个字的开头
13.#l 例如:5l ,56l 光标移动到该行的第'#'个位置
2.删除文字
1.x 每按一次删除光标所在位置的一个字符
2.#x 栗子:6x 删除光标所在位置的"后面"(包含自己在内)6个字符
3.Shift+x == X 每按一次,删除光标所在位置的前一个字符
4.Shift+#x == #X 栗子 20X 删除光标所在位置的前面20个字符
5.dd 删除光标所在行
6.#dd 栗子 6dd 从光标所在行开始删除6行
3.复制、替换、撤销、更改、跳转指定行
#复制
1.yw 将光标所在之处到字尾的字符复制到缓冲区中
2.#yw 栗子 6yw 复制6个字符到缓冲区
3.yy 复制光标所在行到缓冲区
4.#yy 栗子 6yy 拷贝从光标所在的该行"往下数"6行文字
5.p 将缓冲区内的字符贴到光标所在位置
注意:所有与y有关的复制命令都必须与p配合才能完成复制粘贴功能
#替换
1.r 替换光标所在处的字符
2.R 替换光标所到之处的字符,直到按下Esc键为止.
3.ESC进入命令模式,%s/旧字符串/新字符串/g 将文件中的旧字符串全部替换为新字符串(g为全局替换)
#撤销
u 回到上一个操作,按动多次'u'可以执行多次回复
#更改
1.cw 更改光标所在处的字到字尾处
2.c#w 栗子 c3w 表示更改三个字
#跳转到指定行
1.Ctrl+g 列出光标所在行的行号
2.#G 栗子 15G 表示移动光标到文章的第15行行首
# 查找
ESC进入命令模式, /aaa 实现从当前位置向下查找aaa,结合 gg 移动到文本开头可实现从头正向查找
?aaa 实现当前位置向上查找,结合 G移动到文本结尾可实现从末尾开始反向查找
4.退出
#无改动正常退出
Esc 输入冒号 q!
#强制退出
Esc 输入冒号 q!
#保存退出
方法1. Esc 输入冒号 wq
方法2. 在最后输入命令时,直接输入"x",也是一样的,即X=WQ。
方法3. 最快捷的方法:按了ESC后,直接按shift+zz,或者切换到大写模式按ZZ,就可以保存退出了,即是按2下大写的Z。
1.4.8 文本美化
column
$ colunm [参数] [文件名]
在[参数]中,可以指定以下选项:
-s 指定分隔符。 源文本中按照指定分隔符来区分一行下的多个值
-c 根据一行中允许的总字符来格式化输出。
-t 创建表,默认情况下,定界符默认是空格,或使用–s选项指定的字符
-x 默认情况下,行在列之前填充,但是使用此参数可以在填充行之前填充列
-n 默认情况下,多个定界符合并为一个定界符。您可以使用–n参数禁用此行为。
-e 默认情况下,空行将被忽略。您可以使用–e参数禁用此行为。
awk
awk '{print $2}' 针对当前行拿出第二个参数
#统计行数 wc -l
ps -ef|wc -l
# 输出列和内容对齐 column -t
netstat -i | column -t
细碎命令细节
# ls -l 的各项信息
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
# 切换到上一个所在目录
cd -
#显示当前所在位置
pwd
#grep 文本搜索 一般搭配管道使用,在管道左侧输出的文本中搜索
#grep [参数] 要搜索的单词 空格隔开的多个搜索源
#命令末尾可跟 --color 代表高亮显示
grep -i helloworld main.c main.h
ps -ef |grep tomcat
#关机 重启
shutdown -h now: 指定现在立即关机
shutdown +5 "System will shutdown after 5 minutes":指定5分钟后关机,同时送出警告信息给登入用户
reboot: 重开机
reboot -w: 做个重开机的模拟(只有纪录并不会真的重开机)
ln: 创建链接文件
创建软链接文件:ln -s [源文件或目录] [链接名]
软链接特点:权限是所有人都可以访问,并且软连接文件指向源文件。
软链接就像windows系统中的快捷方式一样,特点也都类似。
硬链接: ln -d [源文件或目录] [链接名]类似copy,硬链接大小和源文件一样,并且是同步更新的。
删除源文件或者硬链接文件后再重新恢复回来,两个文件不再有硬链接关系,不再同步更新。
1.5 文件的权限、用户和组
操作系统中每个文件都拥有特定的权限、所属用户和所属组。权限是操作系统用来限制资源访问的机制,在Linux中权限一般分为读(readable)、写(writable)和执行(excutable),分为三组。分别对应文件的属主(owner),属组(group)和其他用户(other),通过这样的机制来限制哪些用户、哪些组可以对特定的文件进行什么样的操作。 ls -l 命令下,每个目录最前面的就是权限,紧邻的的两个就是属主和属组
1.5.1 文件类型
d
表示目录 -
表示文件 l
表示链接
1.5.2 文件权限
对具体文件和目录而言,读写执行表示不同的意义
权限名/文件类型 | 文件 | 目录 |
---|---|---|
r(可读,可用4表示) | 可以使用cat查看文件的内容 | 可以查看目录下列表 |
w(可写,可用2表示) | 可修改文件内容 | 可以创建和删除目录下文件 |
x(可执行,可用1表示) | 可将其运行为二进制文件 | 可以使用cd进入目录 |
之所以是4 2 1,是因为可以用三个 bit
的位数为1情况来判断 。第三位判断是否可读,第二位判断是否可写,第一位判断是否可执行。
-
可使用
chmod
修改文件的权限写法可以直接写参数u/g/o,也可以直接写数字 7=4+2+1 6=4+2 chmod u=rwx,g=rw,o=r aaa.txt chmod 764 aaa.txt
-
软件开机自启,如zookeeper
#为该软件编写启动脚本 vim zookeeperStart.sh #为该脚本添加可执行权限 chmod +x zookeeperStart.sh #将该脚本添加到开机启动项里面 chkconfig --add zookeeperStart.sh #检查是否添加成功 chkconfig --list
除了 rwx 还有 s t i a 权限
a 仅可追加
i 仅可修改
1.5.3 文件的组
linux中,每个文件都有所有者、所有组、其他组的概念
#所有者(属主owner) 默认为创建文件的用户,可通过 chown 修改文件的所有者
#所有组(属组group) 默认为创建文件的用户所在的组,可通过 chgrp 修改
#其他组(属主other) 除去文件所有者和文件所在组下用户之外,都属于文件的其他组
1.5.4 用户配置
vim /etc/profile #所有用户配置
vim ~/.bashrc #当前用户配置
让脚本在任意位置访问
1.确认访问执行权限
确认脚本文件权限是可执行的 有执行(x)权限;脚本路径的各层目录权限,当前用户都有读(r)权限
2.
任意路径下输入命令,都会先从当前目录找,然后去PATH所定义的路径下找
因此在PATH下追加脚本所在路径即可
1.6 系统配置
1.7 系统监控
进程相关
nohup和&的区别
nohup仅忽略SIGHUP信号(挂断),是指程序永久运行的意思,和是否退出终端无关。
也即用nohup启动的程序,终端退出(SIGHUP)后会话不会退出,程序继续后台运行。但是Ctrl+C(SIGINT)会退出程序。
&仅忽略SIGINT信号,是指程序后台运行的意思。
也即用&启动的程序,Ctrl+C(SIGINT)不会退出程序,程序后台运行。但是终端退出(挂起)(SIGHUP)的时候,命令自动也跟着退出。
一般会连着使用 ,表示永不挂断地后台运行,相当于守护进程的概念
nohup command &
进程启动
Ctrl+C 会发出SIGINT挂断信号 会发出SIGHUP信号
nohup
no hang up 永不挂断的意思,
ps
#查看当前系统正在运行进程 ps(process status)
-A, -e all processes
-a all with tty, except session leaders
a all with tty, including other users
-d all except session leaders
-N, --deselect negate selection
r only running processes
T all processes on this terminal#查看线程
x processes without controlling ttys
-C <command> command name
-G, --Group <GID> real group id or name
-g, --group <group> session or effective group name
-p, p, --pid <PID> process id
--ppid <PID> parent process id
-q, q, --quick-pid <PID>
process id (quick mode)
-s, --sid <session> session id
-t, t, --tty <tty> terminal
-u, U, --user <UID> effective user id or name
-U, --User <UID> real user id or name
ps -ef ps -ef|grep redis
ps aux ps aux|grep redis #查看包括redis字符串的进程
ps -p 进程ID(pid)-T
kill
#更改配置而不需停止并重新启动服务
kill -HUP 进程ID (或者kill -1)
#进程不再执行新任务,等待进程已有任务执行完毕后关闭
kill -15 进程ID
#强制终止任务
kill -9 进程ID
Signal Name | Number | Description |
---|---|---|
SIGHUP | 1 | Hangup (POSIX) |
SIGINT | 2 | Terminal interrupt (ANSI) |
SIGQUIT | 3 | Terminal quit (POSIX) |
SIGILL | 4 | Illegal instruction (ANSI) |
SIGTRAP | 5 | Trace trap (POSIX) |
SIGIOT | 6 | IOT Trap (4.2 BSD) |
SIGBUS | 7 | BUS error (4.2 BSD) |
SIGFPE | 8 | Floating point exception (ANSI) |
SIGKILL | 9 | Kill(can’t be caught or ignored) (POSIX) |
SIGUSR1 | 10 | User defined signal 1 (POSIX) |
SIGSEGV | 11 | Invalid memory segment access (ANSI) |
SIGUSR2 | 12 | User defined signal 2 (POSIX) |
SIGPIPE | 13 | Write on a pipe with no reader, Broken pipe (POSIX) |
SIGALRM | 14 | Alarm clock (POSIX) |
SIGTERM | 15 | Termination (ANSI) |
SIGSTKFLT | 16 | Stack fault |
SIGCHLD | 17 | Child process has stopped or exited, changed (POSIX) |
SIGCONT | 18 | Continue executing, if stopped (POSIX) |
SIGSTOP | 19 | Stop executing(can’t be caught or ignored) (POSIX) |
SIGTSTP | 20 | Terminal stop signal (POSIX) |
SIGTTIN | 21 | Background process trying to read, from TTY (POSIX) |
SIGTTOU | 22 | Background process trying to write, to TTY (POSIX) |
SIGURG | 23 | Urgent condition on socket (4.2 BSD) |
SIGXCPU | 24 | CPU limit exceeded (4.2 BSD) |
SIGXFSZ | 25 | File size limit exceeded (4.2 BSD) |
SIGVTALRM | 26 | Virtual alarm clock (4.2 BSD) |
SIGPROF | 27 | Profiling alarm clock (4.2 BSD) |
SIGWINCH | 28 | Window size change (4.3 BSD, Sun) |
SIGIO | 29 | I/O now possible (4.2 BSD) |
SIGPWR | 30 | Power failure restart (System V) |
如何关闭指定端口的进程
windows--
1.根据端口查到进程ID
netstat -ano|findstr "端口" 查询指定端口的进程
如果是java进程,还可以使用jps,根据结果中的应用名快速定位到进程号
2.根据进程ID查询进程名
tasklist | findstr 进程ID
3.关闭进程
taskkill /pid 进程号 -t -f 根据进程号(pid)来关闭进程
taskkill /f /t /im java.exe 根据进程名来关闭进程
linux
1.根据端口号查询进程号
yum install lsof -y
lsof -i:端口号
如果是java进程,还可以使用jps,根据结果中的应用名快速定位到进程号
ps aux|grep '关键字'|awk '{print $2}' 根据进程名关键字定位进程号
2.关闭进程
kill -9 进程号 强制关闭
kill -15 进程号 等待进程完成正在处理中的任务后关闭
ps -ef|grep 关键字|grep -v grep|awk '{print $2}'|xargs kill -9 根据进程名关键字关闭进程
yum install psmisc -y #支持killall命令
killall
#查看本机端口暴露情况
netstat -anltph
#查看本机和6379端口的建立情况
netstat -an|grep 6379
查看Linux进程的线程数
https://blog.csdn.net/laobai1015/article/details/106660074
1、使用top命令,具体用法是
top -H
加上这个选项,top的每一行就不是显示一个进程,而是一个线程。
2、使用ps命令,具体用法是
ps -xH
这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。
3、使用ps命令,具体用法是
ps -mq PID
这样可以看到指定的进程产生的线程数目。
4、使用ps命令,查看进程总数
ps -ef | wc -l
5、使用ps命令,查看系统设置的最大进程数
sysctl kernel.pid_max
6、使用ps命令,查看当前进程数
ps -ef | wc -l
7、查看某个服务的进程数
ps -ef | grep 服务名称 | wc -l
网络状态检测
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
监听8080端口的进程
lsof -i:8080
和8080端口有交互的进程,会显示这些进程处于什么状态
netstat -antlp |grep 8080
TIME_WAIT 814
CLOSE_WAIT 1
FIN_WAIT1 1
ESTABLISHED 634
SYN_RECV 2
LAST_ACK 1
Linux系统工具查看Linux进程
/proc/5000/ 这里面有你所有想要的。其实stat代表着当前的一些信息。
使用ps命令来查看进程的时候,进程状态分别对应的含义如下:
D 不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
R 正在运行或可运行(在运行队列排队中)
S 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
T 已停止的 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行
W 正在换页(2.6.内核之前有效)
X 死进程 (未开启)
Z 僵尸进程 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的
《 高优先级(not nice to other users)
N 低优先级(nice to other users)
L 页面锁定在内存(实时和定制的IO)
s 一个信息头
l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)
+ 在前台进程组
网络通信
#查看当前系统的网卡信息:
centos6: ifconfig centos7: ip addr
#查看与某台机器的连接情况:
ping
#查看当前系统的端口:
netstat
##所有的连接和端口 an
netstat -ano
##tuln 查看正在监听TCP(t)和UDP(u)的端口 ,例如:
netstat -tuln | grep LISTEN
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名 进程 端口信息
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
##rn 查看网关
route -n
## 查看10080端口下的进程
lsof -i:10080
## kill掉10080端口对应的进程
kill-9 `lsof -i:10080`
## windwos关闭指定端口
netstat -ano |findstr “10080”
taskkill /PID 端口的pid /F
系统监控
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息
#格式1
vmstat [-a] [刷新延时 刷新次数]
-a 的含义是用 inact/active(活跃与否) 来取代 buff/cache 的内存输出信息
比如vmstat -a 3 5 ,会每3s统计一次信息,连续5次,也即在12s后,会列出0、3、6、9、12s统计的5条数据
vmstat -a 2 等价于 vmstat 2 表示每2s统计一次,不限次数
#格式2
vmstat [选项]
-fs -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。
-s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。
-S 单位 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
-d 列出硬盘有关读写总量的统计表。
-p 分区设备文件名 查看硬盘分区的读写情况。
#输出字段:
字段 含义
##procs 进程信息字段:
-r:等待运行的进程数,数量越大,系统越繁忙。
-b:不可被唤醒的进程数量,数量越大,系统越繁忙。
##memory 内存信息字段:
-swpd:虚拟内存的使用情况,单位为 KB。
-free:空闲的内存容量,单位为 KB。
-buff:缓冲的内存容量,单位为 KB。
-cache:缓存的内存容量,单位为 KB。
##swap 交换分区信息字段:
-si:从磁盘中交换到内存中数据的数量,单位为 KB。
-so:从内存中交换到磁盘中数据的数量,单位为 KB。
这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。
##io 磁盘读/写信息字段:
-bi:从块设备中读入的数据的总量,单位是块。
-bo:写到块设备的数据的总量,单位是块。
这两个数越大,代表系统的 I/O 越繁忙。
##system 系统信息字段:
-in:每秒被中断的进程次数。
-cs:每秒进行的事件切换次数。 上下文切换频率
这两个数越大,代表系统与接口设备的通信越繁忙。
##cpu CPU信息字段:
-us:非内核进程消耗 CPU 运算时间的百分比。
-sy:内核进程消耗 CPU 运算时间的百分比。
-id:空闲 CPU 的百分比。
-wa:等待 I/O 所消耗的 CPU 百分比。
-st:被虚拟机所盗用的 CPU 百分比。
1.8 服务管理
systemctl
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动
systemd的Unit放在目录/usr/lib/systemd/system(Centos)或/etc/systemd/system(Ubuntu)
#systemctl版本
systemctl –-version
#systemctl一共安装了多少Unit
systemctl list-unit-files
##服务类型的
systemctl list-units --type=service -all
systemctl [command] [unit]
例如: systemctl start mysql.service
systemctl命令兼容了service,即systemctl也会去/etc/init.d目录下,查看,执行相关程序
systemctl redis start
systemctl redis stop
systemctl enable redis
command:
start:立刻启动后面接的 unit。
stop:立刻关闭后面接的 unit。
restart:立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。
reload:不关闭 unit 的情况下,重新载入配置文件,让设置生效。
enable:设置下次开机时,后面接的 unit 会被启动。
disable:设置下次开机时,后面接的 unit 不会被启动。
status:目前后面接的这个 unit 的状态,会列出有没有正在执行、开机时是否启动等信息。
is-active:目前有没有正在运行中。
is-enable:开机时有没有默认要启用这个 unit。
kill :不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。
show:列出 unit 的配置。
mask:注销 unit,注销后你就无法启动这个 unit 了。
unmask:取消对 unit 的注销。
unit--服务
.mount文件定义了一个挂载点
.service文件定义了一个服务
.target定义了一些基础的组件,供.service文件调用
.wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行
服务自启动
vi /usr/lib/systemd/system/es.service
#在文件开头添加:#!/bin/bash,并赋予脚本可执行权限
#如果/etc/systemd/system/myapp.service有过修改,需要进行更新,执行下面这个命令
#systemctl daemon-reload
#查看服务是否被正确识别
#systemctl list-unit-files|grep myapp
[Unit]
Description=tomcatapi
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/apache-tomcat-8.5.29/bin/startup.sh
ExecReload=
ExecStop=/usr/local/apache-tomcat-8.5.29/bin/shutdown.sh
PrivateTmp=true
#设置应用的工作目录
WorkingDirectory=/myapp_path
[Install]
WantedBy=multi-user.target
##赋予执行权限或者使用enable启用服务
chmod +x es.service
systemctl enable es
#启动
systemctl start es
systemctl status es
systemctl stop es
1.9 实际应用
安装JDK
1** 用JDK安装包安装
1. 查看是否已经安装JDK:rpm -qa | grep -i java
2. 若有则删除:rpm -e --nodeps java-xxx,删除所有相关的java
3. 下载[jdk8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)安装包,将gz压缩文件放到指定目录如/usr/local,解压:tar -zxvf jdk-8u181-linux-x64.tar.gz
4. 设置全局变量:vim /etc/profile,追加
JAVA_HOME=/usr/local/jdk1.8.0_181
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
5. source /etc/profile
6. java -version
2 用yum方式安装(无需配置环境变量)
1. 检索yum中有没有java1.8的包:yum list java-1.8*
2. yum install java-1.8.0-openjdk* -y
1.10 脚本编程
如何看已有脚本的作用:
一般脚本都是用各种入参拼凑出一个jvm启动参数,可以实际运行一遍,然后用ps -ef|grep xxx看他启动的进程的参数,里面就是脚本各个参数的最终展现形式,有输入参数,有最终参数,两边向中间压缩就可以看到最终的流程
执行多条命令
;
执行c1; c2; c3
,c1执行完成后c2,c2后c3 某一命令报错不中断执行&&
执行c1&&c2&&c3
,c1执行成功才执行c2,c2成功才c3||
执行c1||c2||c3
,c1执行失败才执行c2,c2失败才c3
Nginx的日志切割-使用crontab
提前建好对应的压缩日志存放目录
mkdir /opt/ftq/nginx/logs/8000_access_log_bak
nginx定期切割日志脚本 cutLog_by_crontab.sh
#将nginx的访问日志压缩
tar zcf /opt/ftq/nginx/logs/8000_access_log_bak/$(date -d +%Y%m%d)_8000accesss.tar.gz /opt/ftq/nginx/logs/8000_access.log
#清空文件内容
truncate -s 0 /opt/ftq/nginx/logs/8000_access.log
#通知Nginx主进程重新读写日志
/opt/ftq/nginx/sbin/nginx -s reopen
定时调度切割脚本 crontab -e
#每周六 23:30执行脚本
30 23 * * 6 sh /opt/ftq/nginx/logs/cutLog_by_crontab.sh
批量杀进程
ps -ef | grep 进程关键字 | grep -v grep | awk '{print "kill "$2}' | sh
lsof | grep 进程关键字 | grep -v grep | awk '{print "kill "$2}' | sh
语法细节
#1参数处理
##脚本输入参数
$# 表示执行脚本传入参数的个数
$* 表示执行脚本传入参数的列表(不包括$0)
$$ 表示进程的id
$@ 表示执行脚本传入参数的所有个数(不包括$0)
$0 表示执行的脚本名称本身
$1 $2 $3 表示脚本名称后跟的第一个、第二个、第三个参数
$? 表示脚本执行的状态,0表示正常,其他表示错误
变量无需定义类型,支持重新定义
name='asds'
name=3
##参数赋值
命令的执行结果赋值给变量
a=$(命令) a=`命令`
脚本参数赋值给变量
a=$1 a=$2
##参数输出为文本 字符串中引用变量
如果希望使用echo输出变量,需要使用双引号包裹 "$a"
或者使用 '"$a"' 这个在sed中很有用
##参数大小写转换
bash 4.0(2009年)引入 ^^ ,,
${param1^} ${param1^^} ${param1,} ${param1,}
依次表示首字母大写、全大写、首字母小写。全小写
# 变量判空
if [ -z "$user" ]; then
fi
# 变量判非空
if [[ "$user" ]]; then
fi
tr '[a-z]' '[A-Z]'
#无视字符串空格
用\ 转义 或者直接用引号包裹字符串
##复杂类型参数
数组的下标从0开始
##参数转义
[[]] {{}}相比 [] {} 无需考虑内部转义和逻辑运算符,推荐使用(比如,&&、||、< 和 > 操作符能够正常存在于 [[ ]] 条件判断结构中,但是如果出现在 [ ] 结构中的话,会报错。)
#2 引入标准linux命令
`` 反引号包裹表示运行系统命令,或者直接写在 $(命令) 里面。命令的执行结果可以赋值给变量,如:
a=$(命令) a=`命令`
#3分支循环、判断
if和then不要写在同一行,如需要可用 ; 隔开
while和until语义恰好相反
##判断参数值不相等
if [[ $name -ne 0 ]];then
fi
##判断参数值相等
if [[ $name -eq 0 ]];then
fi
#4.文件处理
id -u 用户ID root是0
id -g 组id root是0
id -un 用户名 root是 root
https://blog.csdn.net/weixin_39981093/article/details/111205376