Linux常用shell操作

本文最后更新于:4 个月前

Linux

image-20220912165054266

1、Linux目录结构

介绍

Linux文件系统采用级层式树状目录结构,最上层为根目录/

Linux的世界中,一切皆为文件。

img

以下是对这些目录的解释:

  • /bin:**【常用】**
    bin 是 Binaries (二进制文件) 的缩写,这个目录存放着最经常使用的命令

  • /boot: 【常用】
    这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

  • /dev :
    dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

  • /etc: 【常用】
    etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home:**【常用】**
    用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

  • /lib
    libLibrary(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

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

  • /media:【常用】
    linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

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

  • /opt
    optoptional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc:**【不能动】**
    procProcesses(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
    这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

    1
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  • /root:**【常用】**
    该目录为系统管理员,也称作超级权限者的用户主目录。

  • /sbin
    s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

  • /selinux
    这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

  • /srv:**【不能动】**
    该目录存放一些服务启动之后需要提取的数据。

  • /sys:**【不能动】**

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfssysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp
    tmptemporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr:**【常用】**
    usrunix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin:
    系统用户使用的应用程序。

  • /usr/sbin:
    超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src:
    内核源代码默认的放置目录。

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

  • /run
    是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

  • /etc:上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

  • /bin, /sbin, /usr/bin, /usr/sbin:这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。值得提出的是,/bin/usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin/usr/sbin 则是给 root 使用的指令。

  • /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。

可以随便动的目录:opt、home、root、tmp。

2、Vi、Vim和Vi文本编辑器

img

Linux内置了Vi文本编辑器。

Vim具有程序编辑的能力,可以用颜色辨别语法的正确性。

三种模式:

  • 正常模式(默认):可以复制、粘贴、删除
  • 插入模式:按i、I、o、O、a、A、r、R
  • 命令行模式:按Esc再按:进入,wq(保存并退出)、q(退出)、q!(强制退出且不保存)

各种模式的切换:

image-20220117085620979

快捷键

  1. 拷贝当前行 yy,拷贝当前行和向下的5行 yy5,粘贴 p

  2. 删除当前行 dd,删除当前行和向下的5行 5dd

  3. 查找某个单词 /xx,按 n 查找下一个

  4. :noh取消高亮

  5. 设置行号 :set nu,取消行号 :set nonu

  6. 到达文件最末行 G,最首行 gg

  7. 撤销 u

  8. 快速定位到某一行 5 shift+g

  9. y$复制当前位置到结尾,y^复制当前位置到开头

  10. d$删除当前位置到结尾,d^删除当前位置到开头

  11. yw复制单词,dw删除单词

image-20220912195345778

3、开机、重启和用户注销登录

开关机:

  1. 立即关机 shutdown -h now

  2. 一分钟后关机 shutdown -h 1

  3. 立刻重启 shutdown -r now

  4. 关机 halt

  5. 重启 reboot

  6. 把内存数据同步到磁盘 sync

登录与注销:

  1. 登录root用户 su - root
  2. 注销用户 logout

4、用户管理

在Linux中,任何一个需要使用系统资源的用户,都必须向系统管理员申请一个账号。

需要root权限才能使用。

4.1、添加用户

useradd 用户名

  1. 当用户创建成功后,会在home目录自动创建一个和用户同名的家目录。
  2. 可以通过useradd -d 指定目录 新的用户名,给新创建的用户指定家目录。

4.2、设置密码

passwd 用户名,然后输入修改后的密码。

pwd是显示当前的目录

4.3、删除用户

  • userdel 用户名:保留了家目录

  • userdel -r 用户名:不保留家目录

一般建议保留用户的家目录。

4.4、查询用户

id 用户名

4.5、切换用户

su - 用户名

  1. 权限低的到权限高的需要输入密码,反之则不需要。
  2. 如果需要退出到原来的用户,则输入logout/exit

4.6、查询当前用户

whoami

4.7、用户组

组的作用:系统可以对有共性的多个用户进行统一管理。

新增组:groupadd 组名

删除组:groupdel 组名

增加用户时直接加上组:useradd - g 组名 用户名

修改用户的组:usermod -g 组名 用户名

/etc/passwd:用户配置文件

/etc/shadow:口令配置文件

/etc/group:组配置文件

5、实用指令

5.1、运行级别

0:关机

1:单用户(找回丢失密码)

2:多用户没有网络服务

3:多用户有网络服务

4:系统未使用保留给用户

5:图形界面

6:系统重启

使用init 数字来切换不同的运行级别。

使用systemctl get-default获取默认的运行级别。

使用systemctl set-default 级别设置默认的运行级别。

5.2、文件目录类

pwd:显示当前目录的绝对路径

ls:显示所有的文件或者目录

  • -a:把隐藏的文件也显示
  • -l:以列表的形式显示

cd

  • cd ~:回到当前用户的家目录
  • cd ..:回到当前路径的上一级目录

mkdir:创建目录,默认只能创建单级目录

  • -p:可以创建多级目录

rmdir:删除空目录

rm -rf /文件:强制删除目录

touch 文件名:创建一个空文件

cp 文件 目标目录:将文件拷贝到指定目录

cp -r 目录 目标目录:将整个目录复制到指令目录下

\cp -r 目录 目标目录:强制覆盖不提示

rm:移出目录或者文件夹

  • -r:递归删除整个文件夹
  • -f:强制删除不提示

mv

  • 在同一文件目录下,是重命名
  • 在不同文件目录下,是移动/剪切

cat:查看文件内容

  • -n:显示行号

一般配合管道命令使用:cat -n /etc/profile | more

more:基于VI编辑器的文本过滤器,以全屏幕的方式按页显示文本文件的内容。more指令中内置了若干快捷键。

image-20220117154710832

less:分屏查看文件的内容,功能与more相似,但又更加强大。每次只加载一部分内容,根据显示需要加载内容,对于显示大型文件具有较高的效率。

image-20220117211130304

echo:输出内容到控制台。

echo $PATH:输出环境变量。

echo "hello":在控制台输出hello

head:显示文件的开头部分,默认显示10行。

head -n 数字 文件名:查看文件开头的x行。

tail用于输出文件尾部的内容,默认显示10行。

tail -n 5 文件名:查看文档后5行。

tail -f 文件名:实时监控文件内容的变化。

>:输出覆盖,>>:追加

ls -l > 文件:将列表的内容覆盖到指定文件。

ls -al >> 文件:将列表所有(包括隐藏的)内容追加到文件末尾。

cat 文件1 > 文件2:将文件1内容覆盖到文件2。

echo 内容 >> 文件:将内容追加到指定文件。

ln:软连接,也成为符号链接,类似于快捷方式。

ln -s 原文件或目录 软链接名:给原文件或目录创建一个软链接。

rm -rf /软链接名:删除软链接,和文件删除方式一致。

history:查看已经执行过的历史命令。

history 数字:查看最近使用过的数字个指令。

!5:执行历史编号为5的指令。

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为 d 则是目录
  • 当为 - 则是文件;
  • 若是 l 则表示为链接文档(link file);
  • 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
  • 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
文件属性 文件类型
- 常规文件,即file
d 目录文件
b block device 即块设备文件,如硬盘;支持以block为单位进行随机访问
c character device 即字符设备文件,如键盘支持以character为单位进行线性访问
l symbolic link 即符号链接文件,又称软链接文件
p pipe 即命名管道文件
s socket 即套接字文件,用于实现两个进程进行通信

5.3、时间日期类

date:显示当前日期。

date +%Y:显示当前年份。

date +%m:显示当前月份。

date +%d:显示当前是那一天。

date "+%Y-%m-%d %H:%M:%S":显示年月日时分秒。

date -s "时间字符串":手动设置时间。

cal:显示当年当月日历。

cal 2022:显示全年日历。

5.4、搜索查找类

find:从指定目录向下递归地遍历各个子目录,将满足条件的文件或目录显示在终端。

  • -name:按名称
  • -user:按属于指定用户名
  • -size:按文件大小,单位有kMG
    • -n:小于n
    • +n:大于n
    • n:等于n
1
find /etc -user root | more #查找etc目录下属于root用户的文件
1
find /home -name hello.txt #在home目录下查找名为hello.txt的文件
1
find / -size 200M #在整个系统中查找文件大小等于200Mb的文件

locate:快速定位文件路径。第一次运行前,必须使用updatedb来创建locate数据库。

which:查看某个指令在哪个目录下。

grep:过滤查找 【grep (选项) 关键词 文件名】

  • -n:显示匹配行及行号
  • -i:忽略字母大小写

|:管道符号,将前一个命令的处理结果输出传递到后面的命令处理。

案例:查找hello.txt文件中,”yes”所在行及其行号

cat hello.txt | grep -n "yes"

grep -n "yes" hello.txt

5.5、压缩和解压类

gzip:压缩,只能将文件压缩为.gz文件

gunzip:解压

zip:压缩,将文件压缩为.zip文件

  • -r:递归压缩,即压缩目录

zip -r xx.zip 文件路径:将该文件路径下的文件和目录压缩到xx.zip

unzip -d 文件路径 xx.zip:将xx.zip解压到指定文件路径

tar:打包指令,将文件打包为.tar.gz的文件

tar [选项] xxx.tar.gz 打包的文件[可以多个,中间用空格隔开]

  • -c:产生.tar打包文件
  • -v:显示详细信息
  • -f:指定压缩后的文件名
  • -z:打包同时压缩
  • -x:解压.tar文件
  • -C:解压到指定目录

tar -zcvf ab.tar.gz a.txt b.txt:把a.txt和b.txt文件压缩为ab.tar.gz

tar -zxvf ab.tar.gz:解压

tar -zxvf ab.tar.gz -C /opt/tmp2:将压缩文件解压到指定目录,-C

6、Linux组

6.1、所有者

即文件的创建者。

查看文件所有者:ls -ahl

修改文件所有者:chown 用户名 文件名

6.2、所在组

文件所在组即为该文件所有者所在的组。

查看文件所在组:ls -ahl

修改文件所在组:chgrp 目标组名 文件名

添加组:groupadd 组名

修改用户所在组:usermod -g 新的组名 用户名

6.3、其他组

除文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组。

7、权限管理

image-20220118134722185

前面的 0-9 位表示了文件的权限:

0

  • l 是链接,相当于快捷方式 link
  • d 是目录,即文件夹 directory
  • c 是字符设备文件——鼠标、键盘等
  • b 是块设备——硬盘等 block

1-3:文件/目录所有者对该文件/目录拥有的权限 –User

4-6:文件/目录所有者所在组其他用户对该文件/目录拥有的权限 –Group

7-9:文件/目录其他组其他用户对该文件/目录拥有的权限 –Other

1表示文件连接数或子目录数

7.1、rwx权限

对于文件:

r:可以读取,查看

w:可以修改,但并不代表可以删除该文件——删除的前提是对该文件的目录有写的权限

x:可以被执行

对于目录:

r:可以读取,ls 查看目录内容

w:可以修改,对目录内创建/删除/重命名目录

x:可以进入该目录,比如可以执行 cd

7.2、chmod【修改文件/目录权限】

第一种方式:u为所有者,g为所在组,o为其他组,a为所有人;+为添加权限,-为删除权限,=赋值权限。

  1. chmod u=rwx,g=rx,o=x 文件/目录

  2. chmod u+x 文件/目录

  3. chmod a+x 文件/目录

第二种方式:r=4,w=2,x=1

chmod u=rwx,g=rx,o=x 文件/目录

相当于:

chmod 751 文件/目录

7.3、chown

chown newowner 文件/目录:修改所有者

chown newowner:newgroup 文件/目录:修改所有者,所在组

-R:如果是目录,则使其所有子文件或目录递归生效。

7.4、chgrp

-R:如果是目录,则使其所有子文件或目录递归生效。

chgrp newgroup 文件/目录:修改所在组

8、定时任务调度

8.1、crond

任务调度是指某个事件执行的特定的命令或程序。

任务调度分类:

  1. 系统工作:有些重要的工作必须周而复始地执行。
  2. 个别用户工作:个别用户希望执行某些程序。

crontab [选项]

  • -e:编辑任务
  • -l:查询任务
  • -r:删除当前用户的所有任务

service crond restart:重启任务调度

具体指令:*/1 * * * * ls -l /etc > /tmp/to.txt :每隔一分钟执行一次。

1
2
3
4
5
6
7
8
*    *    *    *    *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

特殊字符:

  • *:表示任何时间
  • ,:表示不连续的时间
  • -:表示连续的时间
  • */n:表示每隔多少时间执行一次

案例:

image-20220119143753865 image-20220119145003172

8.2、at

at 命令是一次性定时计划任务,执行一次后就不再执行,at 的守护进程 atd 会以后台模式运行,检查作业队列。atd 默认情况下每 60s 检查一次作业队列,有作业时会检查作业的运行时间,如果作业时间与当前时间匹配,则会执行该作业。

at 命令也可以执行 shell 任务。

ps -ef | grep atd:检测atd是否在运行

image-20220119150636028

at [选项] [时间] 回车 然后输入执行指令

按 ctrl+D 两次结束 at 命令的输入

选项格式:

image-20220119151020336

时间格式:

image-20220119151039102

atq 查看系统中没有执行的工作任务。

atrm 编号 删除指定任务 ,编号可以通过 atq 查看。

案例:

  1. 两天后下午5点执行 /bin/ls /home

    at 5pm + 2 days

    at > /bin/ls /home

  2. 明天下午五点执行

    at 5pm tomorrow
    at> date > /mydate.txt

  3. 一分钟后

    at now + 1 minutes

    at> date > /date1

9、Linux分区

image-20220119154318592

lsblk / lsblk -f:查看所有设备挂载情况。

df -h:整体磁盘使用情况。

du -h 目录:查询指定目录的磁盘占用情况。

image-20220119160319117

磁盘实用指令:

  1. 统计文件夹下文件的个数

    ls -l | grep "^-" | wc -l

    ​ |

    ​ 正则表达式匹配以-开头的文件

  2. 统计文件夹下目录的个数

    ls -l | grep "^d" | wc -l

    ​ |

​ 正则表达式匹配以d开头的文件

  1. 统计文件夹下文件的个数,包括子文件夹下的

    ls -lR | grep "^-" | wc -l

  2. 统计文件夹下目录的个数,包括子文件夹下的

    ls -lR | grep "^d" | wc -l

  3. 树状显示目录结构

    tree 目录

    如果没有tree,则使用 yum install tree 安装。

10、网络配置

image-20220119170236578

查看网络配置:ifconfig

10.1、重新配置ip

  1. vim /etc/sysconfig/network-scripts/ifcfg-ens33

  2. 修改BOOTPROTO=”static”

  3. IPADDR=192.168.138.128

  4. GATEWAY=192.168.200.2

  5. DNS1=192.168.200.2

10.2、设置主机名

hostname:查看主机名

vim /etc/hostname:进入修改主机名

修改之后,必须重启才能生效。

10.3、设置hosts映射

Windows 上:进入 C:/Windows/System32/drivers/etc/hosts ,添加ip地址和映射名。

Linux 上:进入 /etc/hosts ,添加ip地址和映射名。

11、进程管理

在Linux中,每一个执行的程序就是一个进程。

11.1、ps

ps:可以查看当前系统中有哪些进程在执行,以及它们的执行状况。

image-20220120115114307

进程信息说明:

image-20220120115148263

ps -ef:以全格式显示当前所有进程。

信息说明:

image-20220120120652413

11.2、kill & killall

kill [选项] 进程号:终止进程;

killall 进程名称:在系统因负载过大而变得很慢时很有作用。

-9:强迫立即停止

11.3、pstree

更直观地查看进程信息。

-p :显示进程pid

-u :显示进程所属用户

11.4、服务

服务service本质就是进程,运行在后台,会监听某个端口,等待其他程序的请求,比如3306、22。因此我们又称之为守护进程。

service 服务名 [start | stop | restart | reload | status]

  • 启动、停止、重启、重新加载、查询状态

service 指令管理的服务可以在 /etc/init.d 中查看

服务的运行级别:

image-20220120193923604

chkconfig命令:查看服务在各个运行级别的设置

  • chkconfig --list | grep "xxx"

  • chkconfig 服务名 --list

  • chkconfig --level 5 服务名 on/off:设置该服务在具体运行级别的开和关

systemctl指令:设置服务的自启动状态

  • systemctl list-unit-files | grep 服务名:查询服务自启动状态

  • systemctl enable 服务名:设置服务开机自启动,永久生效,需要临时生效则使用 start

  • systemctl disable 服务名:关闭服务开机启动,永久生效,需要临时生效则使用 stop

  • systemctl is-enabled 服务名:查询某个服务是否开机自启动

  • systemctl status 服务名

11.5、firewall

打开和关闭指定端口:

  • 永久开放端口:firewall-cmd –add-port=端口号/协议 –permanent

  • 永久关闭端口:firewall-cmd -remove-port=端口号/协议 –permanent

  • 重新加载防火墙:firewall-cmd –reload

  • 查看已经开放的端口:firewall-cmd –list-all

  • 查看指定端口是否开放:firewall-cmd –query-port=端口号/协议

11.6、netstat

监控网络状态:

netstat [选项]

  • -an:按一定的顺序排列输出
  • -p:显示哪个进程在调用

netstate -anp | more

image-20220121181523293

12、rpm & yum

Linux rpm 命令用于管理套件。

rpm(英文全拼:redhat package manager) 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM 套件管理方式的出现,让 Linux 易于安装,升级,间接提升了 Linux 的适用度。

简单查询指令:

rpm -qa | grep "xxx"

rpm -qi “xxx”:

image-20220121184306653

rpm -ql “xxx”:查询软件包中的文件

rpm -qf “xxx”:文件所属的安装包

**rpm -e “xxx”**:删除软件包

  • –nodeps:强制删除

rpm -ivh rpm包全路径名称

  • -i:安装
  • -v:提示
  • -h:进度条

yum:基于rpm包,自动处理依赖关系,并且一次安装所有依赖的软件包。

yum list:软件列表

yum install xxx:安装软件

13、shell编程

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求(调用操作系统内核)以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

image-20220121200029376

13.1、快速入门

脚本格式

  1. 脚本以#!/bin/bash 开头

  2. 脚本需要有可执行权限 x

脚本执行方式

方式 1(输入脚本的绝对路径或相对路径):

  • 说明:首先要赋予 helloworld.sh 脚本的 + x 权限,
  • 再执行脚本比如 ./hello.sh 或者使用绝对路径 /root/shcode/hello.sh

方式 2(sh+脚本):

  • 说明:不用赋予脚本 + x 权限,直接执行即可。比如 sh hello.sh ,也可以使用绝对路径。

方式 3(source + 脚本).

方式 4(. + 脚本).

13.2、变量

  1. Linux Shell 中的变量分为,系统变量和用户自定义变量。

  2. 系统变量:$HOME、$PWD、$SHELL、$USER 等等,比如: echo $HOME 等等..

  3. 显示当前 shell 中所有变量:set

  1. 定义变量:变量名=值
  2. 撤销变量:unset 变量
  3. 声明静态变量readonly 变量,注意:不能 unset

定义变量的规则:

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头

  2. 等号两侧不能有空格

  3. 变量名称一般习惯为大写

将命令的返回值赋给变量:

1
2
3
1) A=`date`反引号,运行里面的命令,并把结果返回给变量 A

2) A=$(date) 等价于反引号

注释::<<! 内容 !

注意:内容和注释符都应该另起一行。

查看环境变量

  • env
  • printenv HOME
  • echo $HOME

设置环境变量

  1. export 变量名=变量值 (功能描述:将 shell 变量输出为环境变量/全局变量)

  2. source 配置文件 (功能描述:让修改后的配置信息立即生效)

  3. echo $变量名 (功能描述:查询环境变量的值)

位置参数变量

当执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。

$n (功能描述:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体

$@(功能描述:这个变量也代表命令行中所有的参数,不过$@每个参数区分对待

$#(功能描述:这个变量代表命令行中所有参数的个数

预定义变量:

可以直接在 shell 脚本中使用的,事先已经定义好的变量。

  1. $$ (功能描述:当前进程的进程号(PID))

  2. $! (功能描述:后台运行的最后一个进程的进程号(PID))

  3. $?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

了解即可。

运算符:

  1. $((运算式))”或“$[运算式]”或者 expr m + n

  2. 注意 expr 运算符间要有空格, 如果希望将 expr 的结果赋给某个变量,使用 ``

  3. expr m - n

  4. expr \*, /, % 乘,除,取余

条件判断:

  • [ condition ](注意 condition 前后要有空格)

    #非空返回 true,可使用$?验证(0 为 true,>1 为 false)

    应用实例

    [ hspEdu ] 返回 true [ ] 返回 false

    [ condition ] && echo OK || echo not ok 条件满足,执行后面的语句

    判断语句

    常用判断条件

  1. = 字符串比较 2. 两个整数的比较

​ -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于

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

    -r 有读的权限 -w 有写的权限 -x 有执行的权限

  2. 按照文件类型进行判断

​ -f 文件存在并且是一个常规的文件 -e 文件存在

​ -d 文件存在并是一个目录

应用实例

案例 1:”ok”是否等于”ok” 判断语句:使用 =

案例 2:23 是否大于等于 22 判断语句:使用 -ge

案例 3:/root/shcode/aaa.txt 目录中的文件是否存在判断语句: 使用 -f

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
if [ "ok"="ok" ]
then
echo "equal"
fi

if [ 20 -ge 21 ]
then
echo "大"
fi
echo "小"

if [ -f /root/var.sh ]
then
echo "存在"
fi
  • if 判断

    1
    2
    3
    4
    5
    if [ 条件判断式 ] 
    then
    代码
    fi
    或者 , 多分支
    1
    2
    3
    4
    5
    6
    7
    if [ 条件判断式 ] 
    then
    代码
    elif [条件判断式]
    then
    代码
    fi

    注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格。

  • case 语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    case $变量名 in "值 1")

    如果变量的值等于值 1,则执行程序 1

    ;;

    "值 2")

    如果变量的值等于值 2,则执行程序 2

    ;;

    …省略其他分支…


    *)

    如果变量的值都不是以上的值,则执行此程序

    ;;

    esac
  • for 循环

    1
    2
    3
    4
    for 变量 in 值 1 值 2 值 3… 
    do
    程序/代码
    done
    1
    2
    3
    4
    for (( 初始值;循环控制条件;变量变化 ))
    do
    程序/代码
    done
  • while 循环

    1
    2
    3
    4
    while [ 条件判断式 ]
    do
    程序 /代码
    done

    注意:while 和 [有空格,条件判断式和 [也有空格

  • read (选项) (参数)

    选项:

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

    -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。

    参数:指定读取值的变量名

    案例 1:读取控制台输入一个 NUM1 值

    1
    2
    3
    #!/bin/bash    
    read -p "请输入一个数 NUM1=" NUM1
    echo "你输入的 NUM1=$NUM1"

    案例 2:读取控制台输入一个 NUM2 值,在 10 秒内输入。

    1
    2
    3
    #!/bin/bash    
    read -t 10 -p "请输入NUM2=" NUM2
    echo NUM2=$NUM2

13.3、函数

系统函数:

basename 基本语法

功能:返回完整路径最后 / 的部分,常用于获取文件名

basename [pathname] [suffix]

basename [string] [suffix]

(功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。)

选项:

suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。

案例 1:请返回 /home/aaa/test.txt 的 “test.txt” 部分

basename /home/aaa/test.txt

dirname 基本语法

功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分

dirname 文件绝对路径

(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

应用实例

案例 1:请返回 /home/aaa/test.txt 的 /home/aaa dirname /home/aaa/test.txt

自定义函数

1
2
3
4
5
6
7
8
function funname ()
{
#操作
[return int;]
}

调用直接写函数名:
funname 值

奇怪的语法:…

1
2
3
4
5
6
7
8
#!/bin/bash
function getSum() {
SUM=$[$n1+$n2]
echo SUM=$SUM
}
read -p n1= n1
read -p n2= n2
getSum $n1 $n2

14、磁盘管理

查看目录占据空间大小:

1
2
du -sh /home
48M /home/

查看不同层次目录占据空间大小:

1
2
3
du --max-depth=1 -ah /home
48M /home/itbear
48M /home

查看磁盘空间使用情况:

1
2
3
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sdc 251G 2.2G 237G 1% /
1
2
3
4
root@ITBEAR-DESKTOP:/# free -h
total used free shared buff/cache available
Mem: 7.5Gi 433Mi 6.7Gi 0.0Ki 339Mi 6.8Gi
Swap: 2.0Gi 0.0Ki 2.0Gi

Linux常用shell操作
http://blog.itbear666.top/2022/09/18/Linux常用shell操作/
作者
Zane
发布于
2022年9月18日
许可协议