Linux&Shell基础入门笔记

这篇博客详细介绍了Linux系统的基础知识,包括目录结构、网络配置、系统管理及命令使用。网络配置部分讲解了三种连接模式和IP配置。在系统管理中,涉及进程和服务的管理,如service和systemctl的使用,以及系统运行级别。文章还深入讨论了基本的文件操作,如文件权限、所有者和属组的更改,以及查找文件的命令find和locat。此外,博客涵盖了Shell脚本的学习,包括变量、运算符、条件判断、流程控制和正则表达式。通过这个教程,读者可以掌握Linux系统管理和基础Shell编程。
摘要由CSDN通过智能技术生成

linux------目录文件

/bin:binary,存放常用命令

/sbin:存放系统管理员使用的系统管理程序

/home:存放普通用户的主目录

/root:系统管理员主目录

/lib:系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一一些文件。

/etc:所有的系统管理所需要的配置文件和子目录。

/usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

/boot:这里存放的是启动Linux时使用的一 些核心文件,包括-些连接文件以及镜像文件,自己的安装别放这里。

/proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

/srv:service缩写, 该目录存放一 些服务启动之后需要提取的数据。

/sys:这是inux2 .6内核的-个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统sysfs。

/tmp:这个目录是用来存放一 些临时文件的。

/dev:类似于windows的设备管理器,把所有的硬件用文件的形式存储。

/media(CentOS6):linux系统会自动识别一 些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。CentOS7迁移到 /run/media

/mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在/mnt/上,然后进入该目录就可以查看里的内容了。

/opt:这是给主机额外安装软件所摆放的目录。比如你安装一个mysq|数据库则就可以放到这个目录下。默认是空的。

/var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

网络配置

三种连接模式

  1. 桥接模式

    虚拟机直接连接外部物理网络的模式,主机起到了网桥的作用。这种模式下,
    虚拟机可以直接访问外部网络,并且对外部网络是可见的。
    

在这里插入图片描述

  1. NAT模式(NetWork Address Transition)

    虚拟机和主机构建一个专用网络,并通过虚拟网络地址转换(NAT) 设备对IP进行转换。
    虚拟机通过共享主机IP可以访问外部网络,但外部网络无法访问虚拟机。
    

在这里插入图片描述

  1. 仅主机模式
虚拟机只与主机共享一个专用网络,与外部网络无法通信。

在这里插入图片描述

配置网络ip地址

vim /etc/sysconfig/network-scripts/ifcfg-ens33
修改下面加粗部分,地址根据自身情况替换
service network restart

TYPE=“Ethernet” #网络类型(通常是 Ethemet)
PROXY_METHOD=“none”
BROWSER_ONLY=“no”
BOOTPROTO=“static” #IP 的配置方法[none|static|bootp|dhcp](引导
时不 使用协议|静态分配 IP|BOOTP 协议|DHCP 协议)
DEFROUTE=“yes”
IPV4_FAILURE_FATAL=“no”
IPV6INIT=“yes”
IPV6_AUTOCONF=“yes”
IPV6_DEFROUTE=“yes”
IPV6_FAILURE_FATAL=“no”
IPV6_ADDR_GEN_MODE=“stable-privacy”
NAME=“ens33”
UUID=“e83804c1-3257-4584-81bb-660665ac22f6” #随机 id
DEVICE=“ens33” #接口名(设备,网卡)
ONBOOT=“yes” #系统启动的时候网络接口是否有效(yes/no)
#IP 地址
IPADDR=192.168.111.100
#网关
GATEWAY=192.168.111.2
#域名解析器
DNS1=192.168.111.2

(1)物理机能 ping 通虚拟机,但是虚拟机 ping 不通物理机,一般都是因为物理机的
防火墙问题,把防火墙关闭就行
(2)虚拟机能 Ping 通物理机,但是虚拟机 Ping 不通外网,一般都是因为 DNS 的设置有
问题
(3)虚拟机 Ping www.baidu.com 显示域名未知等信息,一般查看 GATEWAY 和 DNS 设
置是否正确
(4)如果以上全部设置完还是不行,需要关闭 NetworkManager 服务
systemctl stop NetworkManager 关闭
systemctl disable NetworkManager 禁用
(5)如果检查发现 systemctl status network 有问题 需要检查 ifcfg-ens33

配置主机名

vim /etc/hostname
或者
hostnamectl set-hostname 名字
hostnamectl或者hostname查看

域名解析,修改hosts映射文件

vim /etc/hosts
ip              主机名
-------------------------
192.168.111.100 hadoop100
-------------------------
远程连接:ssh root@hadoop100

linux系统管理

进程&服务

  • 计算机中,一个正在执行的程序或命令,被叫做“进程“( process )
  • 启动之后一只存在、常驻内存的进程,一般被称作“服务”( service )。

service(centos 6)

  • 基本语法

    service 服务名 start|stop|restart|status
    ----------------------------------------
    /etc/init.d
    

systemctl(cenos 7)

  • 基本语法

    systemctl start|stop|restart|status 服务名
    ------------------------------------------
    usr/lib/systemd/system
    

系统运行级别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aduiXvRQ-1677034570742)(null)]

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

​ 4.centos7的运行级别简化为:

  • multi-user.target(等价于3)
  • graphical.target(等价于5)

​ 5.查看当前运行级别

systemctl get-default

​ 6.切换运行级别

init 3

基本命令

ln软链接

ln -s /root/info myInfo
------------------------
ln -s  目标文件 重命名文件

useradd

  • 基本语法

    useradd 用户名
    useradd -g 组名 用户名 
    cat /etc/passwd
    

为用户获取sudo权限

vim /etc/sudoers
------------------
用户名 ALL=(ALL)   ALL

%用户组名 ALL=(ALL)   ALL      #为整个用户组添加权限

用户组 操作

添加用户组
groupadd 用户组名

将用户添加到用户组
usermod -g 用户组 用户名

修改用户组名字
groupmod -n 新用户名 旧用户名

删除用户组
groupdel 用户组名

文件属性

如果没有权限,就会出现减号[ - ]。从左至右用0-9这些数字来表示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqg5Z0RR-1677034574203)(null)]

(1)0 首位表示类型
在Linux中第一个字符代表这个文件是目录、文件或链接文件等等

- 代表文件
d 代表目录
l 链接文档(link file)

(2)第1-3位确定属主(该文件的所有者)拥有该文件的权限。—User
(3)第4-6位确定属组(所有者的同组用户)拥有该文件的权限,—Group
(4)第7-9位确定其他用户拥有该文件的权限 —Other

rwx 作用文件和目录的不同解释

- 作用到文件:

[ r ]代表可读(read): 可以读取,查看
[ w ]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件
[ x ]代表可执行(execute):可以被系统执行
- 作用到目录:

[ r ]代表可读(read): 可以读取,ls查看目录内容
[ w ]代表可写(write): 可以修改,目录内创建+删除+重命名目录
[ x ]代表可执行(execute):可以进入该目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D12yd6Ov-1677034574120)(null)]

(1)如果查看到是文件:链接数指的是硬链接个数。
(2)如果查看的是文件夹:链接数指的是子文件夹个数。

更改文件权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cnzBa40u-1677034574758)(null)]

- 第一种方式变更权限
chmod [{ugoa}{+-=}{rwx}] 文件或目录
如:chmod u=rw 文件名
   chmod g+r 文件名
-------------------------------------
- 第二种方式变更权限
chmod [mode=421] [文件或目录]
如:chmod 777

修改整个文件夹里面所有文件的权限
chmod -R 777 文件夹名/

更改文件所有者

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

更改文件所属组

chgrp [最终用户组] [文件或目录]

文件查找

find

(1)按文件名:根据名称查找/目录下的.txt文件。
[root@hadoop101 ~]# find -name "*.txt" 
--------------------------------------------------------------
(2)按拥有者:查找/opt目录下,用户名称为tony的文件
[root@hadoop101 ~]# find /opt -user tony 
---------------------------------------------------------------
(3)按文件大小:在/home目录下查找大于200m的文件(+n 大于 -n小于 n等于)
[root@hadoop101 ~]find /home -size +204800 

locat

updatedb
locadte tmp

文件压缩

zip:
zip -r 压缩后的名称(my.zip) 文件地址
unzip -d 指定目录 压缩文件

tar:
tar [选项] XXX.tar.gz 文件
------------------------------------
-c 产生.tar 打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包同时压缩
-x 解包.tar 文件
-C 解压到指定目录
-------------------------------------
打包:tar -zcvf xxx.tar.gz 文件
解包:tar -zxvf xxx.tar.gz 文件

磁盘查看和分区类

du

du 目录/文件
----------------------------------------------------
-h 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-a 不仅查看子目录大小,还要包括文件
-c 显示所有的文件和子目录大小后,显示总和
-s 只显示总和
--max-depth=n 指定统计子目录的深度为第 n 层

df查看磁盘空间使用情况

df -h 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUbxhhbm-1677034574373)(null)]

lsblk查看设备挂载情况

mount/umount挂载/卸载

mount [-t vfstype] [-o options] device dir (功能描述:挂载设备)
umount 设备文件名或挂载点 (功能描述:卸载设备)
--------------------------------------------------------------
-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
                光盘或光盘镜像:iso9660
                DOS fat16 文件系统:msdos
                Windows 9x fat32 文件系统:vfat
                Windows NT ntfs 文件系统:ntfs
                Mount Windows 文件网络共享:smbfs
                UNIX(LINUX) 文件网络共享:nfs
-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
                loop:用来把一个文件当成硬盘分区挂接上系统
                ro:采用只读方式挂接设备
                rw:采用读写方式挂接设备
                iocharset:指定访问文件系统所用字符集
                device 要挂接(mount)的设备
                dir 设备在系统上的挂接点(mount point)
----------------------------------------------------------------
vim /etc/fstab
查看设备所有挂载信息

fdisk分区

fdisk -l (功能描述:查看磁盘分区详情)
fdisk 硬盘设备名 (功能描述:对新增硬盘进行分区操作)
--------------------------------------------------
(1)Linux 分区
Device:分区序列
Boot:引导
Start:从X磁柱开始
End:到Y磁柱结束
Blocks:容量
Id:分区类型ID
System:分区类型

(2)分区操作按键说明
m:显示命令列表
p:显示当前磁盘分区
n:新增分区
w:写入分区信息并退出
q:不保存分区信息直接退出
---------------------------------------------------
创建sdb1分区,并将/home/atguigu挂载到该分区
p主分区e扩展分区,最多有4个主分区,一共最多16个
mkfs格式化 创建文件系统:mkfs -t xfs /dev/sdb1
mount /dev/sdb1 /home/atguigu

ps查看当前系统进程

ps aux | grep xxx (功能描述:查看系统中所有进程)
ps -ef | grep xxx (功能描述:可以查看子父进程之间的关系)
----------------------------------------------------
a    列出带有终端的所有用户的进程
x    列出当前用户的所有进程,包括没有终端的进程
u    面向用户友好的显示风格
-e   列出所有进程
-u   列出某个用户关联的所有进程
-f   显示完整格式的进程列表
--------------------------------------------------------
USER:该进程是由哪个用户产生的
UID:用户 ID
PID:进程的 ID 号
C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
STIME:进程启动的时间
%CPU:该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源;
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;
VSZ:该进程占用虚拟内存的大小,单位 KB;
RSS:该进程占用实际物理内存的大小,单位 KB;
TTY:该进程是在哪个终端中运行的。对于 CentOS 来说,tty1 是图形化终端,tty2-tty6 是本地的字符界面终端。pts/0-255 代表虚拟终端。
STAT:进程状态。常见的状态有:R:运行状态、S:睡眠状态、T:暂停状态、
Z:僵尸状态、s:包含子进程、l:多线程、+:前台显示
START:该进程的启动时间
TIME:该进程占用 CPU 的运算时间,注意不是系统时间
COMMAND:产生此进程的命令名
CMD:启动进程所用的命令和参数

pstree进程树

-p 显示进程的 PID
-u 显示进程的所属用户

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

netstat -anp | grep 进程号 (功能描述:查看该进程网络信息)
netstat –nlp | grep 端口号 (功能描述:查看网络端口号占用情况)
------------------------------------------------------
-a 显示所有正在监听(listen)和未监听的套接字(socket)
-n 拒绝显示别名,能显示数字的全部转化成数字
-l 仅列出在监听的服务状态
-p 表示显示哪个进程在调用

crontab计划任务

-e 编辑 crontab 定时任务
-l 查询 crontab 任务
-r 删除当前用户所有的 crontab 任务
---------------------------------
第一个“*” 一小时当中的第几分钟  0-59
第二个“*” 一天当中的第几小时    0-23
第三个“*” 一个月当中的第几天    1-31
第四个“*” 一年当中的第几月      1-12
第五个“*” 一周当中的星期几      0-7 ( 0 和 7 都 代 表 星 期 日)
----------------------------------------------------------
* 		代表任何时间。比如第一个“*”就代表一小时中每分钟都执行一次的意思。
, 	   代表不连续的时间。比如“0 8,12,16 * * * 命令”,就代表在每天的 8 点 0 分,12 点 0 分,16 点 0       分都执行一次命令
- 		代表连续的时间范围。比如“0 5 * * 1-6 命令”,代表在周一到周六的凌晨 5 点 0 分执行命令
*/n 	代表每隔多久执行一次。比如“*/10 * * * * 命令”,代表每隔 10 分钟就执行一遍命令
-------------------------------------------------------------
45 22 * * * 		命令 每天 22 点 45 分执行命令
0 17 * * 1 			命令 每周 1 的 17 点 0 分执行命令
0 5 1,15 * * 		命令 每月 1 号和 15 号的凌晨 5 点 0 分执行命令
40 4 * * 1-5 		命令 每周一到周五的凌晨 4 点 40 分执行命令
*/10 4 * * * 		命令 每天的凌晨 4 点,每隔 10 分钟执行一次命令
0 0 1,15 * 1 		命令 每月 1 号和 15 号,每周 1 的 0 点 0 分都会执行命令。注意:星期几和几号最好不					 要同时出现,因为他们定义的都是天。非常容易让管理员混乱。

RPM软件包管理

查询:
rpm -qa (功能描述:查询所安装的所有 rpm 软件包)
rpm -qi 包名
---------------
卸载:
rpm -e RPM软件包
rpm -e --nodeps 软件包(卸载软件时,不检查依赖)
---------------
安装:
rpm -ivh RPM 包全名
---------------
-e 			卸载软件包
-i 			安装
-v 			显示详细信息
-h 			进度条
--nodeps    不检查依赖

yum安装

-y 			对所有提问都回答“yes”
install 	安装 rpm 软件包
update 		更新 rpm 软件包
check-update 检查是否有可用的更新 rpm 软件包
remove 		删除指定的 rpm 软件包
list 		显示软件包信息
clean 		清理 yum 过期的缓存
deplist 	显示 yum 软件包的所有依赖关系
----------------------------------------
                  修改源
----------------------------------------
默认的系统 YUM 源,需要连接国外 apache 网站,网速比较慢,可以修改关联的网络
YUM 源为国内镜像的网站,比如网易 163,aliyun 等
1.安装 wget, wget 用来从指定的 URL 下载文件
[root@hadoop101 ~] yum install wget

2.在/etc/yum.repos.d/目录下,备份默认的 repos 文件, 
[root@hadoop101 yum.repos.d] pwd
[root@hadoop101 yum.repos.d] cp CentOS-Base.repo CentOS-Base.repo.backup

3.下载网易 163 或者是 aliyun 的 repos 文件,任选其一,如图 8-2
[root@hadoop101 yum.repos.d] wget
http://mirrors.aliyun.com/repo/Centos-7.repo //阿里云
[root@hadoop101 yum.repos.d] wget
http://mirrors.163.com/.help/CentOS7-Base-163.repo //网易 163

4.使用下载好的 repos 文件替换默认的 repos 文件
例如:用 CentOS7-Base-163.repo 替换 CentOS-Base.repo
[root@hadoop101 yum.repos.d]# mv CentOS7-Base-163.repo CentOS-Base.repo

5.清理旧缓存数据,缓存新数据
[root@hadoop101 yum.repos.d]#yum clean all
[root@hadoop101 yum.repos.d]#yum makecache
yum makecache 就是把服务器的包信息下载到本地电脑缓存起来

6.测试
[root@hadoop101 yum.repos.d]# yum list | grep firefox
[root@hadoop101 ~]#yum -y install firefox

Shell

Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3JPFnth-1677034574909)(null)]

Linux 提供的 Shell 解析器有

cat /etc/shells
---------------
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

变量范围更改

首先自定义一个局部变量:
my_var="Hello,world"
提升为全局变量
export my_var
(只在子shell里面有效)

$符号的使用

$n位置参数

$n (功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
--------------------------------------------
#!bin/bash
echo script name: $0    当前文件名
echo 1st paramater: $1  输出第一个参数
echo 2nd paramater: $2  输出第二个参数

$#获取输入参数个数

$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)
---------------------------------------------
echo paramater numbers: $# 

∗ 、 *、 @

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
---------------------------------------------------------------

$?

$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一
个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明
上一个命令执行不正确了。)
---------------------------------------------------------------------
[11@hadoop101 shells]$ ./helloworld.sh
hello world
[11@hadoop101 shells]$ echo $?
0

运算符

expr 1+2
expr 1 + 2
expr 5 - 3
expr 5 \* 2
--------------------------------
“$((运算式))” 或 “$[运算式]”
a=$(expr 5\*2)
a=`expr 5\*4`
echo $[5*2]
echo S((5*2))
--------------------------------
计算(2+3)* 4 的值
[atguigu@hadoop101 shells]# S=$[(2+3)*4]
[atguigu@hadoop101 shells]# echo $S

条件判断

基本语法
(1)test condition
(2)[ condition ](注意 condition 前后要有空格)
注意:条件非空即为 true,[ atguigu ]返回 true,[ ] 返回 false
---------------------------------------------------------
常用判断条件
(1)两个整数之间比较
		-eq 等于(equal)         -ne 不等于(not equal)
		-lt 小于(less than)     -le 小于等于(less equal)
		-gt 大于(greater than)  -ge 大于等于(greater equal)
注:如果是字符串之间的比较 ,用等号“=”判断相等;用“!=”判断不等。
注:当两个判断条件在一个方括号内时,使用-a表达&&,使用-o表达||
----------------------------------------------------------
(2)按照文件权限进行判断
		-r 有读的权限(read)
		-w 有写的权限(write)
		-x 有执行的权限(execute)
如:[ -r hello.sh ]
----------------------------------------------------------
(3)按照文件类型进行判断
		-e 文件存在(existence)
		-f 文件存在并且是一个常规的文件(file)
		-d 文件存在并且是一个目录(directory)
-----------------------------------------------------------
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
a=15
[ $a -lt 20 ] && echo "$a < 20" || echo "$a > 20"

流程控制

if分支

(1)单分支

if [ 条件判断式 ];then
	程序
fi
if [ 条件判断式 ]
then
	程序
fi

(2)多分支

if [ 条件判断式 ]
then
	程序
elif [ 条件判断式 ]
then
	程序
else
	程序
fi

①[ 条件判断式 ],中括号和条件判断式之间必须有空格

②if 后要有空格

注意在判断等式时,可能出现期待一元表达式

#!/bin/bash

if [ $1 = atguigu ]
then
		echo "welcome"
fi
------------当没有输入时报错"期待一元表达式",正确如下---------------
#!/bin/bash

if [ "$1"x = "atguigu"x ]
then
		echo "welcome"
fi

case语句

case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

(1)case 行尾必须为单词“in”,每一个模式匹配必须以右括号 )结束。
(2)双分号“;;”表示命令序列结束,相当于 java 中的 break。
(3)最后的“*)”表示默认模式,相当于 java 中的 default。

#!/bin/bash

case $1 in
1)
	echo "one"
;;
2)
	echo "two"
;;
3)
	echo "three"
;;
*)
	echo "number else"
;;
esac

for循环

for (( 初始值;循环控制条件;变量变化 ))
do
	程序
done
for 变量 in 值 1 值 2 值 3…
do
	程序
done
1+2+3+.....+i
-----------------------------------
#!/bin/bash
sum=0
for (( i=1;i<=$1;i++ ))
do
	sum=$[ $sum + $i ]
done
echo $sum
------------------------------------
for os in linux windows macos; do echo $os; done
------------------------------------
for i in {1..100}
do
	sum=$[$sum+$i]
done
echo $sum

{}序列

从1-100的序列
{1..100}

while循环

while [ 条件判断式 ]
do
	程序
done
#!/bin/bash
a=1
while [ $a -le $1 ]
do
	sum=$[$sum+$a]
	a=$[$a+1]
done
echo $sum
-----------另一种写法---------------
#!/bin/bash
a=1
while [ $a -le $1 ]
do
	let sum+=a
	let a++
done
echo $sum

read读取控制台输入

read (选项) (参数)
①选项:
	-p:指定读取值时的提示符;
	-t:指定读取值时等待的时间(秒)如果-t 不加表示一直等待
②参数:
	变量:指定读取值的变量名
---------------------------------------------------
#!/bin/bash

read -t 10 -p "请输入学号:" number
echo "welcome $number"

系统函数

#!/bin/bash

filename="$1"_log_$(date +%s)
echo $filename
------------------
date +%s(时间戳)

basename

basename [string / pathname] [suffix] 
(功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
basename 可以理解为取路径里的文件名称
选项:
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
截取该/home/atguigu/banzhang.txt 路径的文件名称。
basename /home/atguigu/banzhang.txt

basename /home/atguigu/banzhang.txt .txt

dirname

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

[atguigu@hadoop101 ~]$ dirname /home/atguigu/banzhang.txt
/home/atguigu

自定义函数

[ function ] funname[()]
{
	Action;
	[return int;]
}
-------------------------------------------
函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,
将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
实现文件的归档
--------------------------------------------------
#!/bin/bash
#首先判断输入参数个数是否为1,输入的是一个路径名
if [ $# -ne 1 ]
then
	echo "参数个数错误!应该输入一个参数,作为归档目录名"
	exit
fi

# 从参数中获取目录名称
if [ -d $1 ]
then
	echo
else
	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

正则表达式

1.常规匹配

| grep

2.常用特殊字符

(1)^ 匹配一行的开头

cat /etc/passwd | grep ^a
-----------------------------
以a开头的行

(2)$ 匹配一行的结束

cat /etc/passwd | grep t$
-----------------------------
匹配所有以t结尾的行

(3). 匹配一个任意的字符

cat /etc/passwd | grep r..t
-----------------------------
r和t中间有两个字符的行

(4)* 某一字符出现任意次

cat /etc/passwd | grep ro*t  
------------------------------
可以匹配到root和rot
------------------------------
.*
表示任意字符出现任意次数

(5)[] 字符的区间

[6,8]--------匹配6或8
[0-9]--------匹配一个0-9的数字
[0-9]*-------匹配任意长度的数字字符串
[a-z]--------匹配一个a-z之间的字符
[a-z]*-------匹配任意长度的
[a-c,e-f]----匹配a-c或e-f之间的任意字符
-----------------------------------
cat /etc/passwd | grep r[a,b]t
-----------------------------------
匹配rat或者rbt

(6)\ 转义

cat /etc/passwd | grep '\$'
手机号匹配
| grep ^1[345678][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
| grep -E ^1[345678][0-9]{9}$

文本处理工具

cut

cut [选项参数] filename

-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列,默认是制表符“\t”
-c 按字符进行切割 后加加 n 表示取第几列 比如 -c 1

awk

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

的部分再进行分析处理

awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}...’ filename
pattern:表示 awk 在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令

-F 指定输入文件分隔符
-v 赋值一个用户定义变量
------------------------------------------
cat /etc/passwd | grep ^root | cut -d ":" -f 1,7
cat /etc/passwd | awk -F ":" '/^root/{print $1","$7}'
只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,shell 在最后一行添加"dahaige,/bin/zuishuai"
-----------------------------------------------------------------------
cat /etc/passwd | awk -F ":" 'BEGIN{print "user,shell"}{print $1","$7} END{print "end of file"}'
cat /etc/passwd | awk -v i=1 -F ":" '{print $3+i}'

awk内置变量

FILENAME 文件名
NR 		 已读的记录数(行号)
NF 		 浏览记录的域的个数(切割后,列的个数)

综合案例

我们可以利用 Linux 自带的 mesg 和 write 工具,向其它用户发送消息。


需求:实现一个向某个用户快速发送消息的脚本,输入用户名作为第一个参数,后面直

接跟要发送的消息。脚本需要检测用户是否登录在系统中、是否打开消息功能,以及当前发

送消息是否为空。

#!/bin/bash

# 查看用户是否登录
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')
if [ -z $login_user ]
then
	echo "$1 不在线!"
	echo "脚本退出.."
	exit
fi

# 查看用户是否开启消息功能
is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
if [ $is_allowed != "+" ]
then
	echo "$1 没有开启消息功能"
	echo "脚本退出.."
	exit
fi

# 确认是否有消息发送
if [ -z $2 ]
then
	echo "没有消息发出"
	echo "脚本退出.."
	exit
fi

# 从参数中获取要发送的信息
whole_msg=$(echo $* | cut -d " " -f 2- )

#获取用户登录的终端
user_terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')

# 写入要发送的消息
echo $whole_msg | write $login_user $user_terminal


if [ $? != 0 ]
then
	echo "发送失败!"
else
	echo "发送成功!"
fi
exit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Swaynie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值