一、Linux目录结构

linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。

在Linux世界里,一切皆文件

  • /bin [常用] (usr/bin 、 /usr/local/bin)

    是Binary的缩写,这个目录存放着最经常使用的命令

  • /sbin (usr/sbin ./usr/local/sbin)

    s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序

  • /home [常用]

    存放普通用户的主目录,在Linux中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名,

  • /root [常用]

    该目录为系统管理员,也称作超级权限者的用户主目录

  • /lib

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

  • /lost+found

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

  • /etc [常用]

    所有的系统管理所需要的配置文件和子目录my.conf

    • /etc/passwd

      • 用户( user)的配置文件,记录用户的各种信息

      • 每行的含义 : 用户名:口今:用户标识号:组标识号(gid):注释性描述:主目录:登录Shell

    • /etc/shadow

      • 口令的配置文件

      • 每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

    • /etc/group

      • 组(group)的配置文件,记录Linux包含的组的信息

      • 每行含义 : 组名:口令:组标识号:组内用户列表

  • /usr [常用]

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

  • /boot [常用]

    存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件

  • /proc [别动]

    这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息

  • /srv [别动]

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

  • /sys [别动]

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

  • /tmp

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

  • /dev

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

  • /media [常用]

    linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下

  • /mnt [常用]

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

  • /opt

    这是给主机额外安装软件所存放的目录。如安装ORACLE数据库就可放到该目录下。默认为空

  • /usr/local [常用]

    这是另一个给主机额外安装软件所安装的目录。一般是通过编译源码方式安装的程序

  • /var [常用]

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

  • /selinux [security-enhanced linux]

    SELinux是一种安全子系统,它能控制程序只能访问特定文件,有三种工作模式,可以自行设置

二、远程

远程登录

具体开发中的应用场景:

  1. linux服务器是开发小组共享
  2. 正式上线的项目是运行在公网
  3. 因此程序员需要远程登录到Linux进行项目管理或者开发
  4. 画出简单的网络拓扑示意图(帮助理解)
  5. 远程登录客户端有 Xshell6,Xftp6,其它的远程工具大同小异

Xshell6,Xftp6下载

下载流程: 输入姓名、邮件、勾选两者,然后点击下载,去邮箱里面等待邮件,点击链接即可下载

使用Xshell连接

  • 1、获取ip:

输入命令

1
ifconfig
  • 2、打开主机命令提示符终端,测试是否是否连通
1
ping 192.168.37.129

失败的话,检查主机服务

再重启网络

1
2
3
4
5
service NetworkManager stop

service network restart

service NetworkManager start
  • 3、打开xshell

新建会话

点击创建好的会话

输入账号密码(也可以在新建会话的时候,选择左边用户身份验证,输入账号密码)

后面的弹窗选择接受并保存(中间那个)

结果:

远程文件传输

使用xftp

1、新建会话

乱码注意第五步,或者右键建立好的会话,选择属性

三、vi、vim

Linux 系统会内置 vi 文本编辑器
Vim 具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

模式

  • 正常模式

    以 vim 打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中,你可以使用[上下左右] 按键来移动光标,你可以使用[删除字符]或[删除整行]来处理档案内容 ,也可以使用[复制、粘贴]来处理你的文件数据。

  • 插入模式

    按下i,l,o,o,a,A,R等任何一个字母之后才会进入编辑模,一般来说按i即可.

  • 命令行模式

    在这个模式当中,可以提供你相关指令,完成读取、存盘、替换、离开 vim 、显示行号等的动作则是在此模式中达成的!

模式切换

:w:保存文件但不退出vi

:w file: 将修改另外保存到file中,不退出vi

:w!: 强制保存,不推出vi

:wq: 保存文件并退出vi

:wq!: 强制保存文件,并退出vi

:q: 不保存文件,退出vi

:q!: 不保存文件,强制退出vi

:e!: 放弃所有修改,从上次保存文件开始再编辑

快捷键

效果 使用
复制 【正常模式】yy:复制光标所在的一行,nyy:复制多行,例如:5yy就是复制光标开始以下5行
粘贴 【正常模式】p:粘贴内容
删除 【正常模式】dd:删除光标所在的一行,ndd:删除多行,例如:5dd就是删除光标开始以下5行
查找 【命令行模式】/关键字,回车,按下n(查找下一个)
行号 【命令行模式】:set nu:打开行号;:set nonu:关闭行号
定位 【正常模式】G:行尾;gg:行首;n + shift+g:定位到第 n 行
撤回 【正常模式】u:撤回

四、关机重启同步,登录注销

关机

  • 立即关机

    1
    shutdown -h now
    1
    halt
  • 一分钟后关机

    1
    shutdown -h 1

重启

  • 立即重启

    1
    shutdown -r now
    1
    reboot

同步

  • 把内存中的数据同步到磁盘

    1
    sync

目前的 shutdown/reboot/halt 等命令均已经在关机前进行sync,但是小心驶得万年船,还是在操作前使用一次sync

登录注销

登录时尽量少用 root 帐号登录,因为它是系统管理员,最大的权限,避免操作失误。可以利用普通用户登录,登录后再用”su- 用户名’命令来切换成系统管理员身份

  • 切换用户

    1
    su - 用户名
  • 注销

    1
    logout

五、用户管理

用户

1、添加用户

  • 默认目录在/home
1
useradd 用户名

细节说明:

当创建用户成功后,会自动的创建和用户同名的家目录

  • 也可以通过以下命令,给新创建的用户指定家目录
1
useradd -d 指定目录 新的用户名,

2、设置密码

基本语法:

1
passwd 用户名

3、显示当前用户所在目录

Print Working Directory

基本语法:

1
pwd

4、删除用户

  • 基本用法,但是保留了家目录(一般建议保留)
1
userdel 用户名
  • 删除用户,以及用户主目录(谨慎使用)
1
userdel -r 用户名

5、查询用户信息

基本语法:

1
id 用户名

6、切换用户

  • 权限高到权限低不需要输入密码,反之需要
  • 返回原来用户使用exit 或者 logout

基本语法:

1
su - 要切换的用户名

7、查看当前用户信息

基本语法:

1
who am ic

用户组

结合第十二节 组 学习

系统可以对有共性/权限的多个用户进行统一管理

1、新增组

基本语法:

1
groupadd 组名

2、删除组

基本语法:

1
groupdel 组名

3、增加用户时,直接指定到用户组

基本语法:

1
useradd -g 用户组 用户名

4、修改用户组

已有的组修改组,没有组的用户指定组

基本语法:

1
usermod -g 用户组 用户名

其他

1
usermod -d 目录名 用户名

说明:改变用户登陆的初始目录;[特别说明]:用户需要有进入到这个目录的权限才行

六、运行级别

1、说明

运行级别 说明
0 关机
1 单用户[找回丢失密码]
2 多用户状态没有网络服务
3 多用户状态有网络服务
4 系统未使用保留给用户
5 图形界面
6 系统重启

常用运行级别是3和5,也可以指定默认运行级别 ,后面演示

2、切换不同的运行级别

基本语法:

1
init [0123456] 

3、指定默认运行级别

在/etc/inittab文件中

面试题

如何找回root密码?

1、centos7以后系统

[第一步]、启动系统、进入开机界面、按‘e’进入编辑界面(注意要快)

[第二步]、在图示位置(UTF-8后面)输入init=/bin/sh,然后按Ctrl + x进入单用户模式

[第三步]

  • 1、输入
1
mount -o remount,rw /
  • 2、回车,再输入
1
passwd

输入要设定的密码,回车再次输入,回车,显示passwd…就说明修改成功了

  • 3、回车,再输入
1
touch /.autorelabel
  • 4、回车,再输入以下命令点击回车,就可以等待系统自动修改密码了,时间会有点长,耐心等待即可
1
exec /sbin/init

七、帮助命令

1、man指令

man命令是Linux下最核心的命令之一。而man命令也并不是英文单词“man”的意思,它是单词manual的缩写,即使用手册的意思。man命令会列出一份完整的说明。 其内容包括命令语法、各选项的意义及相关命令 。更为强大的是,不仅可以查看Linux中命令的使用帮助,还可以查看软件服务配置文件、系统调用、库函数等帮助信息。man手册页文件存放在/usr/share/man目录下。

基本语法:

1
man 要查询的指令

常用选项

选项 说明
-a 在所有的man帮助手册中搜索
-d 主要用于检查,如果用户加入了一个新的文件,就可以用这个参数检查是否出错
-f 显示给定关键字的简短描述信息
-p 指定内容时使用分页程序
-M 指定man手册搜索的路径
-w 显示文件所在位置

快捷键

效果 快捷键
退出 q
按行下翻 Enter
按页下翻 Space
上翻一页 b
查找 /关键字

2、help指令

help命令用于显示shell内部命令的帮助信息。
help命令只能显示shell内部命令的帮助信息,而linux系统中绝大多数命令是外部命令,所以help命令的作用非常有限。而对于外部命令的帮助信息可以使man命令或者info命令查看。

基本语法:

1
help 要查询的参数

常用选项

选项 说明
-d 输出每个命令的简短描述
-s 输出短格式的帮助信息
-m 以伪man手册的格式显示帮助信息

八、文件目录指令

- pwd|ls|cd|mkdir|rmdir|touch|cp|rm|mv

  • pwd

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

基本语法:

1
pwd
  • ls

功能:查看目录下的文件和目录

基本语法:

1
ls 要查看的目录

常用选项

选项 说明
-a 都显示,包括隐藏的
-l 以列表的方式显示信息

也可以组合起来写

1
2
3
ls -al
或者
ls -la

用适合人的方式显示:比如文件大小4,则会显示成4.0k

1
ls -lh
  • cd

功能:切换工作目录

基本语法:

1
cd 指定目录

实例:

返回用户家目录

1
2
3
cd ~
或者直接
cd

回到当前目录的上一级

1
cd ..
  • mkdir

功能:创建目录

基本语法:

1
mkdir [选项] 要创建的目录

常用选项

选项 说明
-p 创建多级目录
  • rmdir

功能:删除空目录

基本语法:

1
rmdir 要删除的目录

目录非空则使用

1
rm -rf
  • touch

功能:创建空文件

基本语法:

1
touch 文件名
  • cp

功能:拷贝文件到指定目录下

基本语法:

1
cp [选项] 需拷贝的文件 指定目录

常用选项

选项 说明
-r 递归复制整个文件夹

重复文件强制覆盖

1
\cp -r 需拷贝的文件 指定目录
  • rm

功能:移除文件或者目录

基本语法:

1
rm [选项] 要删除的目录

常用选项

选项 说明
-r 递归删除整个文件夹
-f 强制删除不提示
  • mv

功能:移动文件与目录 或 重命名

基本语法:

移动文件

1
mv 文件或目录 移动到的新目录

重命名(位置不变即为重命名)

1
mv 文件或目录 原目录

- cat|more|less|echo|head|tail|>|>>

  • cat

功能:查看文件内容

基本语法:

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

常用选项

选项 说明
-n 显示文件内容并显示行号

为了浏览方便,一般会带上管道命令 | more

  • more

功能:

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

基本语法:

1
more 要查看的文件

快捷键

操作 说明
space 下翻一页
enter 下翻一行
q 退出
Ctrl + F 向下滚动一屏
Ctrl + B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行行号
  • less

功能:

less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率

基本语法:

1
less 要查看的文件

快捷键

操作 说明
space 下翻一页
[pagedown] 下翻一页
[pageup] 上翻一页
/关键字 向下搜寻[关键字]的功能; n: 向下查找; N: 向上查找
?关键字 向上搜寻[关键字]的功能; n: 向上查找; N: 向下查找
q 退出
  • echo

功能:输出内容到控制台

基本语法:

1
echo [选项] 输出内容
  • head

功能:用于显示文件开头部分内容,默认显示10行

基本语法:

缺省显示10行

1
head 文件

显示n行

1
head -n 行数n
  • tail

功能:用于显示文件尾部部分内容,默认显示10行

基本语法:

缺省显示10行

1
tail 文件

显示n行

1
tail -n 行数n

实时追踪该文档的所有更新

1
tail -f 文件
  • >、>>

功能:
>: 输出重定向(覆盖)
>>: 追加
基本语法加案例

(1)功能描述 : 列表的内容写入文件a.txt中( 覆盖写)

1
ls -l > 文件

(2)功能描述 : 列表的内容追加到文件aa.txt的末尾

1
ls -al >> 文件

(3)功能描述 : 将文件1的内容覆盖到文件2

1
cat 文件1 > 文件2

(4) 追加

1
echo “内容" >> 文件 

- ln|history|date

  • ln

功能:软链接也称为符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径

基本语法:

1
ln -s [源文件或目录] [软链接名]

案例:

pwd显示的软链接,比如上面的案例,再输入pwd,则会显示/root/demo/ggw软链接

  • history

功能:查看已经执行过历史命令,也可以执行历史指令

基本语法:

1
history

查看 n 条最近使用的指令

1
history n

执行历史编号为 n 的指令

1
!n

九、时间日期类

  • date

功能1:显示当前时间

基本语法:

(1)显示当前时间

1
date 

(2)显示当前年份

1
date +%Y

(3)显示当前月份

1
date +%m

(4)显示当前是那一天

1
date +%d

(5)显示当前年月日时分秒

1
date "+%Y-%m-%d %H:%M:%S"

功能2:设置日期

基本语法:

1
date -s 字符串时间

案例:

设置成:2020-11-03 20:03:21

1
date -s "2020-11-03 20:03:21"
  • cal

功能:查看日历

基本语法:

缺省显示本月日历

1
cal [选项]

案例:

显示某一年的日历

1
cal 年份(2023)

十、搜索查找类

  • find

功能:从指定目录向下递归遍历其各个子目录,将满足条件的文件或目录显示在终端上面

基本语法:

1
find [搜索范围] [选项]

常用选项

选项 说明
-name<查询方式> 按照指定文件名查找模式查找文件
-user<用户名> 查找属于指定用户名的所有文件
-size<文件大小> 按照指定的文件大小查找文件

案例:

按文件名:根据名称查找/home 目录下的hello.txt文件

1
find /home -name hello.txt

案例2 : 按拥有者 :查找/opt目录下,用户名称为 nobody的文件

1
find /opt -user nobody

案例3 : 查找整个linux系统下大于200M的文件( +n 大于 -n小于 n等于,单位有 k,M,G)

1
find / -size +200M
  • locate

功能:

locate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。Locate指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate时刻

基本语法:

1
locate 搜索文件

特别说明由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updatedb指令创建locate数据库.
案例:
请使用locate指令快速定位 hello.txt 文件所在目录

1
2
updatedb
locate hello.txt
  • which

功能:查看某个指令在那个目录下

基本语法:

1
which 指令
  • grep和“|”

功能:grep: 过滤查找; 管道符“|”:表示将前一个命令的处理结果输出传递给后面的命令处理。

基本语法:

1
grep [选项] 查找内容 源文件

常用选项

选项 说明
-n 显示匹配行以及行号
-i 忽略字母大小写

案例:

请在hello.txt文件中,查找“yes”所在的行,并显示行号

1
cat hello.txt | grep -n "yes"

或者

1
grep -n "yes" ./hello.txt

十一、压缩和解压类

  • gzip / gunzip

功能:gzip: 压缩文件; gunzip: 解压

基本语法:

描述:压缩文件,但是只能是*.gz文件

1
gzip 文件

描述:解压缩文件

1
gunzip 文件.gz
  • zip / unzip

功能:zip: 压缩文件; unzip: 解压; 在项目打包发布中很有用

基本语法:

1
zip [选项] 打包后文件名.zip 要压缩的内容
1
unzip [选项] xxx.zip

unzip常用选项

选项 说明
-d 指定压缩文件存放目录

案例

1、将/home下的所有文件/文件夹进行压缩成myhome.zip

1
zip -r myhome.zip /home/

这条命令会把home目录也压缩进去

2、将myhome.zip解压到/opt/tmp目录下

1
unzip -d/opt/tmp /home/myhome.zip
  • tar

功能:打包指令,最后的文件是.tar.gz*

基本语法:

1
tar [选项] 打包后的文件名.tar.gz 打包内容

常用选项:

选项 说明
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z 打包的同时压缩
-x 解压缩.tar文件

案例:

1、压缩多个文件,将/home/pig.txt 以及 /home/cat.txt 压缩成 pc.tar.gz

1
tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

2、将/home文件夹压缩成 demo.tar.gz

1
tar -zcvf demo.tar.gz /home/

3、将 pc.tar.gz解压到当前目录

1
tar -zxvf pc.tar.gz

4、将demo.tar.gz解压到 /opt/tmp2目录下

1
mkdir /opt/tmp2
1
tar -zxvf /home/demo.tar.gz -C /opt/tmp2

十二、组

结合第五节 用户管理的用户组 学习

在linux中,所有用户都必须属于一个组里面,不能独立于组外

1、所有者

一般为文件的创建者,谁创建了,就自然属于谁

  • chown

功能:修改文件/目录的所有者

基本语法:

1
chown 用户名 文件/目录

常用选项

选项 说明
-R 如果是目录则其下所有子文件或目录递归生效

案例:

2、所在组

当某个用户创建了一个文件后,这个文件就属于用户所在的组

  • chgrp

功能:修改文件所在的组

基本语法:

1
chgrp 组名 文件名

用法与chown类似

常用选项

选项 说明
-R 如果是目录则其下所有子文件或目录递归生效

3、权限

0 - 9位说明

0 - 9位 说明
第0位 确定文件类型:
l 是链接,相当于Windows快捷方式
d 是目录,相当于windows文件夹
c 是字符设备文件: 鼠标键盘
b 是块设备,比如硬盘
第1 - 3位 确定文件所有者的文件权限
第4 - 6位 确定文件所属组的权限
第7 - 9位 确定其他用户拥有的权限
  • rwx作用到文件

1、[r]:代表可读(read):可以读取,查看
2、[w]:代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
3、[×]:代表可执行(execute):可以被执行

  • rwx作用到目录

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

rwx还可以用数字表示,r=4,w=2,x=1,则rwx=7

其他说明:

这个数字代表:文件:则代表的是硬连接数;目录:则代表的是子目录数

  • chmod

功能:修改文件或目录权限

基本语法:

u: 所有者; g: 所在组; o: 其他人; a: 所有人

1
chmod u=rwx,g=rx,o=x 文件名/目录名
1
chmod o+w 文件名/目录名
1
chmod a-x 文件名/目录名

案例:

1、给abc文件的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限

1
chmod u=rwx,g=rx,o=rx abc

用数字表示等同于(rwx = 4 + 3 + 1, rx = 4 + 1, x = 1)

1
chmod 751 abc

2、文件的所有者除去执行的权限,增加组写的权限

1
chmod u-x,g+w abc

十三、Shell编程

1、了解

  • 为什么要学习Shell编程

    • 1、linux运维工程师在进行服务器集群管理时,需要编写shell程序来进行服务器管理。
    • 2、对于JavaEE和Python程序员来说,是工作的需要,上级可能会要求编写一些shell脚本进行型程序或者是去维护服务器,比如编写一个定时备份服务器的脚本。
    • 对于大数据程序员来说,,需要编写shell程序来管理集群。
  • Shell是什么

    Shell是一个命令解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,

    用户可以使用Shell来启动、挂起、停止甚至编写一些程序。

2、脚本的执行方式

  • 脚本格式要求

    • 1、脚本要以#!/bin/bash开头
    • 2、脚本要有可执行权限
  • 脚本常用的执行方式

    • 方式1、输入脚本的绝对路径或相对路径

      说明:首先要赋予脚本可执行权限,再执行脚本

    • 方式2、sh + 脚本

      说明:不用赋予脚本权限,直接执行即可

案例:创建一个Shell脚本,执行输出hello world

1
2
#!/bin/bash
echo "hello world"

使用方式1执行

使用方式2执行

3、变量

  • 变量的介绍

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

2、系统变量:$HOME, $PWD、$%SHELL、$USER等等

  • set

功能:显示当前shell中的所有变量

基本语法:

1
set
  • Shell变量定义

基本语法:

1、定义变量

1
变量名=值

2、撤销变量

1
unset 变量名

3、声明静态变量(静态变量不能被unset)

1
readonly 变量

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
echo "--------------------------"
#1、定义变量a
a=114514
#输出变量要加上$
echo a=$a
echo "a=$a"

echo "--------------------------"
#2、撤销变量a
unset a
echo "a=$a"

echo "--------------------------"
readonly b=2
echo "b=$b"
unset b
echo "b=$b"

输出结果

  • 定义变量的规则

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

2、等号两侧不能有空格

3、变量名称一般为大写(上面是负面教材),这是个规范,不是规则

  • 将命令的放回值赋给变量

1、使用反引号

1
变量=`命令`

2、$()

1
变量=$(命令)

案例:

1
2
3
#!/bin/bash
A=`date`
echo "A=$A"

输出结果:

1
A=2023年 01月 12日 星期四 10:38:58 CST

4、设置环境变量

基本语法:

1、将shell变量输出为全局变量

1
vim /etc/profile
1
export 变量名=值

2、属性,使其立即生效

1
source 配置文件(/etc/profile)

案例:

1、设置并查看环境变量

5、注释

基本语法:

1
2
3
:<<!
内容

6、位置参数变量和预定义变量

  • 位置参数变量

介绍当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息

基本语法:

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

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

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

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

案例:

  • 预定义变量

就是shell设计者事先已经定义好的变量,可以直接在shell中使用

基本语法:

$$:功能描述:当前进程的进程号(PID)
$!:功能描述:后台运行的最后一个进程的进程号(PID)
$?:功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体是哪个数,由命令来决定),则证明上一个命令执行不正确。

案例:

1
2
3
4
5
6
#!/bin/bash
echo "当前执行的进程id=$$"
#以后台的方式运行一个脚本,并获取他的进程号
/home/ggw/shellscripts/demo2.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是:$?"

运行结果:

7、运算符

基本语法:

1、使用$[运算式](推荐)、$((运算式))或者expr m + n(expression)

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

3、expr m - n

4、expr \*,/,%,分别代表乘、除、取余

案例:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#使用方式一
ANS1=$(((2+3)*4))
echo "ANS1=$ANS1"
#使用方式二
ANS2=$[(2+3)*4]
echo "ANS2=$ANS2"
#使用方式三
TMP=`expr 2 + 3`
ANS3=`expr $TMP \* 4`
echo "TMP=$TMP"
echo "ANS3=$ANS3"

输出结果:

1
2
3
4
ANS1=20
ANS2=20
TMP=5
ANS3=20

8、条件判断语句

基本语法:

注意条件两边要有空格,非空返回true,可使用$?验证(0为true, >1为false)

1
[ contition ]

案例:

[ xxx ]返回true

[]返回false

[ xxx ] && echo "ok" || echo "hello"条件满足,执行后面的语句

  • 判断语句

1、常用判断条件

(1)= 字符串比较

(2)两个整数比较

方法 说明
-eq 等于 equal
-ne 不等于 not equal
-lt 小于 little
-le 小于等于 little equal
-gt 大于 greater
-ge 大于等于 greater equal

(3)按文件权限进行判断

方法 说明
-r 有读的权限
-w 有写的权限
-x 有执行的权限

(4)按文件类型进行判断

方法 说明
-f 文件存在并且一个常规文件
-e 文件存在
-d 文件存在并且是一个目录

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#1、"ok"是否等于"ok"
if [ "ok" = "ok" ]
then
echo "1、相等"
fi
#2、23是否大于22
# 判断语句:使用 -gt
if [ 23 -gt 22 ]
then
echo "2、大于"
fi
#3、判断文件/home/ggw/shellscripts/demo1.sh是否存在
if [ -f /home/ggw/shellscripts/demo1.sh ]
then
echo "3、存在"
fi

输出结果:

1
2
3
1、相等
2、大于
3、存在

9、流程控制

  • if-fi判断

基本语法:

1
2
3
4
if [ 条件判断式 ]
then
代码
fi
  • if-elif-fi判断

基本语法:

1
2
3
4
5
6
7
if [ 条件判断式 ]
then
代码
elif [ 条件判断式 ]
then
代码
fi
  • if-else-fi

基本语法:

1
2
3
4
5
6
if [ 条件判断式 ]
then
代码
else
代码
fi
  • case语法

基本语法

1
2
3
4
5
6
7
8
9
10
11
case $变量名 in
"值1")
代码
;;
"值2")
代码
;;
*)
都不是执行此处代码
;;
esac

案例

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
case $1 in
"1")
echo "1"
;;
"2")
echo "2"
;;
*)
echo "nothing"
esac

输出结果:

  • for循环

基本语法1:

1
2
3
4
for 变量 in 值1 值2 值3...
do
代码
done

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
for KEY in $*
do
echo "num is $KEY"
done
echo "---------------------------"
for KEY in $@
do
echo "num is $KEY"
done
echo "==========================="
for KEY in "$*"
do
echo "num is $KEY"
done
echo "---------------------------"
for KEY in "$@"
do
echo "num is $KEY"
done

输出结果:

基本语法2:

1
2
3
4
for ((初始值;循环控制条件;变量变换))
do
代码
done

案例:

输出1-100的和

1
2
3
4
5
6
7
#!/bin/bash
SUM=0
for(( i=1; i<=100; i++))
do
SUM=$[$SUM+$i] #获取SUM的值才需要加"$"符号
done
echo "1-100的和是$SUM"

输出结果:

1
1-100的和是5050
  • while循环

基本语法:

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

案例:

输出1-100的和

1
2
3
4
5
6
7
8
9
#!/bin/bash
SUM=0
i=0
while [ $i -le "100" ]
do
SUM=$[SUM+$i]
i=$[$i+1]
done
echo "1-100的和是$SUM"

输出结果

1
1-100的和是5050

10、read读取控制台输入

基本语法:

1
read [选项] 参数

常用选项:

选项 说明
-p 指定读取值时的提示符
-t 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了

案例:

1
2
3
#!/bin/bash
read -p "请输入:" -t 10 RES
echo "输入的结果是:$RES"

输出结果

11、 函数

shell编程和其它语言一样,有系统函数,也可以自定义函数。

1、系统函数

  • basename

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

基本语法:

1
basename [pathname] [suffix]

选项:

如果加速suffix(后缀)的话,如果suffix被指定,basename会将pathname或string中的suffix去掉

案例:

请返回/home/ggw/demo.txt的demo

  • dirname

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

案例:

请返回/home/ggw/demo.txt的/home/ggw

2、自定义函数

基本语法:

定义:

1
2
3
4
5
[ function ] funname[()]
{
Action;
[return int;]
}

调用:

1
funname [值]

案例:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#函数定义
function getSum() {
SUM=$[$NUM1+$NUM2]
echo "和是$SUM"
}
NUM1=$1
NUM2=$2
#调用
getSum $NUM1 $NUM2

输出结果

12、练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash
# 1)判断当前用户是否为root,
# 如果为root则输出Current user : root;否则输出Current user : 用户名;
if [ `whoami` = "root" ]
then
echo "Current user : root"
else
echo "Current user : `whoami`"
fi

# 2)检查当前目录是否为用户主目录,
# 是当前用户主目录则输出You are in the home directory!;
# 如果不是当前用户主目录,则进入当前用户主目录,然后输出You have gone back to your home directory!;
if [ `pwd` = $HOME ]
then
echo "You are in the home directory!"
else
cd ~ # 需要用source p4.sh 或者 . p4.sh来执行,才会生效
echo "You have gone back to your home directory!"
fi

# 3)检测工作目录中是否存在bin子目录,
# 如果存在则先删除该目录,再重新创建bin目录,并输出bin has been recreated!;
# 否则直接创建bin目录后输出bin has been created!;
CURPWD=`pwd`
if test -z `find $CURPWD -name bin` # 结果为空
then
mkdir bin
echo "bin has been created!"
else
rmdir bin
mkdir bin
echo "bin has been recreated!"
fi

# 4)使用set命令将date命令执行的结果设置成位置参数,然后通过位置参数判断今天是否为休息日(周六或周日),
# 如果是则输出Today is a weekend! ;
# 否则输出Today is 英文星期几的前三位缩写(如Wed)。(注:上面的分号都用于语句分隔,不是需要输出的内容)
set `date`
if [ $1 = "Sat" ] || [ $1 = "Sun" ]
then
echo "Today is a weekend!"
else
echo "Today is $1"
fi