avatar

目录
Linux学习笔记

Linux学习笔记

一、安装

  • VM15

  • CentOS7(以下所有操作均以该系统运行)

安装教程:https://blog.csdn.net/qq_44714603/article/details/88829423

后期安装图形界面:

Code
# 安装Gnome包
$sudo yum groupinstall "GNOME Desktop" "Graphical Administration Tools"

然后设置默认运行级,重启:

Code
$sudo systemctl set-default graphical.target
$sudo reboot

二、系统介绍

2.1 目录结构

【转】https://www.runoob.com/linux/linux-system-contents.html

系统启动必须:

  • /boot:存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。

  • /etc:存放所有的系统需要的配置文件子目录列表,更改目录下的文件可能会导致系统不能启动。

  • /lib:存放基本代码库(比如c++库),其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

  • /sys: 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中

指令集合:

  • /bin:存放着最常用的程序和指令

  • /sbin:只有系统管理员能使用的程序和指令。

外部文件管理:

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

  • /media:类windows的其他设备,例如U盘、光驱等等,识别后linux会把设备放到这个目录下。

  • /mnt:临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

临时文件:

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

  • /lost+found:一般情况下为空的,系统非法关机后,这里就存放一些文件。

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

账户:

  • /root:系统管理员的用户主目录。

  • /home:用户的主目录,以用户的账号命名的。

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

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

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

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

运行过程中要用:

  • /var:存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)。

  • /proc:管理内存空间!虚拟的目录,是系统内存的映射,我们可以直接访问这个目录来,获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件来做修改。

扩展用的:

  • /opt:默认是空的,我们安装额外软件可以放在这个里面。

  • /srv:存放服务启动后需要提取的数据(不用服务器就是空)

2.2 运行级

Linux系统在任何时候都运行于某个运行级上,且不同运行级运行的程序和服务都不同,所要完成的工作和要达到的目的都不同。

运行级0:关闭计算机,使用shutdown-h命令时,系统转入该状态。

运行级1:单用户模式,不带网络,运行最小系统,用于系统修复,不进行用户身份验证,一般默认运行级不用1

运行级2:多用户模式(与运行级3相似,不带网络功能)

运行级3:带有网络支持的多用户模式,常用的运行级别,但是没有图形界面。

运行级4:系统保留备用

运行级5:用于自动启动 XFree886系统(图形方式),常用的默认运行级

运行级6:重新启动,使用shutdown–r命令时,系统转入该状态。

查看当前系统的运行级

Code
$systemctl get-default

# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

注:如果系统启动后,不是运行级5,则启动字符界面(shell),要想进入图形界面可用命令 startx

切换运行级

Code
$systemctl set-default TARGET.target

# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

系统运行级服务

可以在 /etc/rc.d 目录下查看,不同运行级下的开启的不同服务。

也可以运行一下命令查看:可以看到1-6运行级下,哪些服务会启动。

Code
$chkconfig --list

netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off

2.3 守护进程

一般以d结尾,表示daemon。(一般是需要一直运行的程序,如网页服务器)

查看一个服务状态:

Code
systemctl [status | start | stop] serverName

如:

Code
$systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-04-15 06:22:37 CST; 12min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 986 (sshd)
CGroup: /system.slice/sshd.service
└─986 /usr/sbin/sshd -D

2.4 引导与启动

avatar

avatar

三、系统基本命令

3.1 man 系统调用使用手册

Code
man name			# 查询name使用说明(下面的命令具体情况都可以进行查看)
man section name # 查找指定章节的说明
man -k refexp # 根据正则表达式查找匹配手册目录

参数解析:

name:名称

section:章节数(常见编号如下)

  • 1:命令
  • 2:系统调用
  • 3:库函数
  • 5:配置文件

refexp:正则表达式

3.2 系统时间

3.2.1 获取系统当前时间

Code
[root@centos7 ~]# date
Fri Mar 6 00:36:56 CST 2020
[root@centos7 ~]# date "+%Y-%m-%d %H:%M:%S"
2020-03-06 00:34:37

3.2.2 校准时间

需要root权限才能更改:

Code
[root@centos7 ~]# ntpdate 0.pool.ntp.org
5 Mar 16:39:38 ntpdate[2065]: step time server 84.16.67.12 offset -28799.352921 sec

如果没有安装ntpdate的话,先执行安装指令:

Code
yum -y install ntpdate

3.2.3 系统运行时间

Code
[wbw@centos7 ~]$ uptime
17:02:19 up 52 min, 3 users, load average: 0.00, 0.01, 0.05

结果解析:

17:02:19:当前时间

up 52 min:系统自动后到当前已经运行的时间

3 users:当前有3个用户登录系统

load average: 0.00, 0.01, 0.05:近期1、5、15分钟内系统CPU负载平均调度队列长度

3.3 日历

Code
cal				# 查看当月日历
cal 2020 # 查询指定年日历
cal 10 2019 # 查询指定年月日历

3.4 计算器

Code
bc

安装指令:

Code
yum -y install bc

3.5 系统资源

3.5.1 top 资源占用进程

top:列出资源占用排名靠前的进程

Code
top

3.5.2 ps 进程状态

ps:查阅进程状态

Code
[root@centos7 ~]# ps
PID TTY TIME CMD
1955 pts/0 00:00:00 bash
2176 pts/0 00:00:00 ps
# 更详细的信息(可以不加e)
[root@centos7 ~]# ps -e
[root@centos7 ~]# ps -ef | more
[root@centos7 ~]# ps -el | more

3.5.3 free 内存使用情况

free:内存使用情况

Code
free

3.5.4 vmstat 系统负载

vmstat:了解系统负载

Code
vmstat
vmstat 1 # 每隔1秒打印一次信息

3.5.5 df 系统资源使用情况

df [-h]

Code
[wbw@s201 /home/wbw]$df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.8M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 5.3G 12G 31% /
/dev/sda1 1014M 137M 878M 14% /boot
tmpfs 98M 0 98M 0% /run/user/1000

3.6 who 查看系统登录用户

who:列出当前已登录系统的用户

Code
[wbw@centos7 ~]$ who
root tty1 2020-03-06 00:11
root pts/0 2020-03-06 00:24 (192.168.174.1)
wbw pts/1 2020-03-05 16:57 (192.168.174.1)

tty:打印当前终端设备文件名

Code
[wbw@centos7 ~]$ tty
/dev/pts/1

who am i:列出当前终端上登录的用户

Code
[wbw@centos7 ~]$ who am i
wbw pts/1 2020-03-05 16:57 (192.168.174.1)

whoami:仅列出当前系统用户名

Code
[wbw@centos7 ~]$ whoami
wbw

3.7 关机、重启

重启

Code
$reboot

关机

Code
$shutdown [-t sec] [-rkhncfF] time [warning-message]

-t sec:发送警告信息。(一个服务器,可能有多个用户连接)

-r:重启

-h:关机

time:可以用绝对时间00:00:00 也可 相对+mm

四、Linux 基础操作

4.1 tab 命令补全

只需要打命令的前几个字符,然后按下tab键,会进行自动补全。

4.2 alias 别名

我们可以对一些命令进行取别名操作:

Code
$ alias ll
alias ll='ls -l --color=auto'

我们还可以自定义命令别名:

Code
$ alias wbwll='ls -l'
$ wbwll
total 12
-rw-rw-r--. 1 wbw wbw 58 Mar 5 17:35 filelist.txt
-rw-rw-r--. 1 wbw wbw 106 Mar 5 17:45 file.txt
-rw-rw-r--. 1 wbw wbw 14 Mar 5 18:09 nums.txt
drwxrwxr-x. 2 wbw wbw 6 Mar 5 18:50 work

但是换一个终端就失效了,如果想一直实现的话可以修改~/.bashrc文件,在末尾添加:

Code
# 别名描述
alias wbwll='ls -l'

4.3 clear 清屏

清空当前屏幕的内容

4.4 pwd 打印当前目录

Code
$ pwd
/home/wbw

4.5 sudo 临时超级管理权限

添加普通用户临时使用root权限

  1. 切换root用户

  2. 添加sudo文件的写权限

    Code
    chmod u+w /etc/sudoers
  3. 修改/etc/sudoers文件

    Code
    vim /etc/sudoers

    添加如下内容:

    Code
    ## Allow root to run any commands anywhere
    root ALL=(ALL) ALL
    # 如给XXX添加sudo权限
    XXX ALL=(ALL) ALL
  4. 撤销sudoers文件写权限

    Code
    chmod u-w /etc/sudoers

sudo + command时,提示找不到命令

  1. 切换root用户

  2. 添加sudo文件的写权限

    Code
    chmod u+w /etc/sudoers
  3. 修改/etc/sudoers文件

    Code
    vim /etc/sudoers

    找到 Defaults env_reset , 将其改为 Defaults !env_reset

  4. 撤销sudoers文件写权限

    Code
    chmod u-w /etc/sudoers
  5. 切换到当前用户

  6. 修改配置文件~/.bashrc

    Code
    vim ~/.bashrc

    末尾添加

    Code
    alias sudo='sudo env PATH=$PATH'
  7. 重启系统

4.6 $PS1 一级提示符

Code
[wbw@centos7 ~]$

其中[wbw@centos7 ~]就是一级提示符,我们可以对其自定义修改:

  1. 编辑profile文件,添加环境变量PS1

    Code
    [/etc/profile]
    export PS1='[\u@\h `pwd`]\$'
  2. 更新配置

    Code
    $>source /etc/profile
    [wbw@centos7 /home/wbw]$

4.7 touch 创建文件

将文件的最后一次修改时间设置为当前时间,但不修改文件内容。例如: touch*.[ch]

Code
touch <filePath文件路径>

4.8 mkdir 创建目录

Code
mkdir [-p 创建父目录] <dirPath目录路径>

4.9 ln 链接

Code
ln [参数][源文件或目录][目标文件或目录]

软链接

  • 1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  • 2.软链接可以跨文件系统 ,硬链接不可以
  • 3.软链接可以对一个不存在的文件名进行链接
  • 4.软链接可以对目录进行链接

硬链接

  • 1.硬链接,以文件副本的形式存在。但不占用实际空间。
  • 2.不允许给目录创建硬链接
  • 3.硬链接只有在同一个文件系统中才能创建

必要参数

  • -b 删除,覆盖以前建立的链接
  • -d 允许超级用户制作目录的硬链接
  • -f 强制执行
  • -i 交互模式,文件存在则提示用户是否覆盖
  • -n 把符号链接视为一般目录
  • -s 软链接(符号链接)【不带s为硬链接】
  • -v 显示详细的处理过程

注意!

如果判断不是绝对路径(/开头),那么以相对路径解析:

avatar

Code
设当前目录(bash进程的当前目录)为d
ln -s d1/dlb d1/dx
在d1下新建文件d
访问d1/dx实际访问d1/d1/d1b

4.10 ls 文件列表

控制列表格式,有选择的为每个项目列出某些属性。

-F(现在终端有颜色了,少用)

Code
若列出的是目录,就在名字后面缀以斜线/
若列出的是可执行文件,就在名字后面缀以星号*
若列出的是符号连接文件,就在名字后面缀以符号@
若列出的是普通文件,则名字面后无任何标记

例:$ls -F
anthorized_keys downloads/ hadoop/ hive/ tmp/ zookeeper/

-l :长格式列表

Code
例:$ls -l arg
-rw-rw-r--. 1 wbw wbw 390 Feb 26 21:09 anthorized_keys
drwxrwxr-x. 5 wbw wbw 4096 Mar 29 16:47 downloads
1rwxrwxrwx. 1 root sys 11 Jul 11 07: 31 unix->/stand/unix
crw-r--r--. 1 bin ter 0, 9 Oct 18 09: 56 /dev/tty10
prw-r--r--. 1 root sys 2642 ct1811:07 /tmp/pipe

-h:便于人阅读的方式打印

Code
[wbw@s201 /home/wbw]$ls -lh
total 16K
-rw-rw-r--. 1 wbw wbw 390 Feb 26 21:09 anthorized_keys
drwxrwxr-x. 5 wbw wbw 4.0K Mar 29 16:47 downloads

-a:显示隐藏信息

Code
[wbw@s201 /home/wbw]$ls -la
total 52
drwx------. 11 wbw wbw 261 Mar 9 23:31 .
drwxr-xr-x. 3 root root 17 Jan 16 16:20 ..
-rw-rw-r--. 1 wbw wbw 390 Feb 26 21:09 anthorized_keys

-i:列出文件的i节点号

Code
[wbw@s201 /home/wbw]$ls -li
total 16
17284854 -rw-rw-r--. 1 wbw wbw 390 Feb 26 21:09 anthorized_keys
20134 drwxrwxr-x. 5 wbw wbw 4096 Mar 29 16:47 downloads

4.11 cp 拷贝文件

Code
cp file1 file2
cp file1 file2 dir:将file1 file2拷贝到目录路径下

-r :递归复制
-u : 增量拷贝。根据文件的时戳,不拷贝相同的或者过时的版本的文件,以提高速度。

4.12 mv 移动(重命名)文件

Code
mv file1 file2

4.13 rm 删除文件

Code
rm file1 file2 ... filen

-r : 递归(删除目录)
-i : 删除前确认
-f : 强制删除

4.14 cd 改变当前目录

Code
cd /a/b/c
cd .. // 返回上一级目录
cd // 返回主目录

4.15 rsync 数据备份工具

远程同步 remote sync,可以镜像整个目录树。优化的流程,增量文件传输,效率高。

rsync用一精巧的算法,将文件分块,在两主机间传播数据块的hash值,据此推出两版本文件之间区别,使得网络只传输文件的增、删、改部分。

示例:(拷贝文件到另一台主机上)

Code
[wbw@s201 /home/wbw]$rsync test.tmp wbw@s202:~/test.tmp

4.16 find 遍历目录树

find命令的三个基本功能

  • find命令从指定的查找范围开始,递归地查找子目录
  • 凡满足条件的文件或目录
  • 执行规定的动作

命令的特点

  • 功能强,选项较多

  • 递归式查找,提供了一种遍历目录树的手段

  • find命令提供的灵活性:

    在“动作”中可以指定任何命令(也包括用户自己编写的处理程序),使得find成为一个任意处理命令可以借用来进行目录遍历的壳(类似awk对文本的逐行扫描,find对目录森林中的文件和目录逐个扫描)

-name

Code
find verl.d ver2.d -name '*.c' -print
范围: 当前目录的子目录ver1.d和ver2.d
条件: 与名字*c匹配。注:c应当用引号括起!
动作: 把查找到的文件的路径名打印出来

-regex:整个路径名与正则表达式匹配

Code
find xxx -regex pattern

-type:根据类型查找

Code
f:普通文件
d:目录
l:符号连接文件
c:字符设备文件
b:块设备文件
p:管道文件

其他条件选项:

Code
(文件属性字段可用来对遍历到的目标进行筛选,查阅find手册)
指定i节点号-inum
可指定文件主-user,-nouser
可指定用户组group,-nogroup
指定link数 -links
指定路径深度-depth
指定文件的访问权限-perm
根据文件大小-size +-n单位
根据最后修改日期-mtime +-ndays
比file还老的文件-newer file

复合条件

Code
◆非:
find . ! -type d -links +2 -print
从当前目录开始检索link数大于2的非目录文件

* 条件“非”用!
注意:!号与-type之间必须保留一空格

◆条件1 或 条件2:
find ~ -size +100k \(-name core -o -name '*.tmp' \) -print
从主目录开始寻找大于100KB的名叫core或有tmp后缀

* 使用了两条件“或”(-o)及组合(圆括号)
* 不要遗漏了所必需的引号,反斜线和空格,尤其是圆括号前和圆括号后。圆括号是shel的特殊字符

find的动作选项

Code
-print
打印查找的文件的路径名
-exec
◆对查找到的目标执行某一命令
◆在-exec及随后的分号之间的内容作为一条命令在这命令的命令参数中,{代表遍历到的目标文件的路径名
-exec 参数后面跟的是 command命令,注意点如下:

command命令的终止,使用 ';' (分号)来判定,在后面必须有一个 ';'

'{}',使用{}来表示文件名,也就是find前面处理过程中过滤出来的文件,用于command命令进行处理

特别强调,对于不同的系统,直接使用分号可能会有不同的意义, 使用转义符 '\'在分号前明确说明.

4.17 tar 文件归档

选项第一字母指定要执行的操作,是必需的

Code
c: Create创建新磁带。从头开始写,以前存于磁带上的数据会被覆盖掉
t: Table列表。磁带上的文件名列表,当不指定文件名时,将列出所有的文件
x: eXtract抽取。从磁带中抽取指定的文件当不指定文件名时,抽取所有文件

除功能字母外的其它选项

Code
v: Verbose冗长。每处理一个文件,就打印出文件的文件名,并在该名前冠以功能字母
f: file。指定设备文件名
z: 采用压缩格式(gzip算法)
j: 采用压缩格式(bzip2算法)

例子:

Code
# 打包文件
tar -cvf xxx.tar work
# 解压
tar -zxvf file.tar.gz

4.18 程序后台挂起与恢复

【转】https://blog.csdn.net/carolzhang8406/article/details/51314894

  1. linux下我们如果想一个任务或者程序还后台执行可以使用&,实际上linux还提供了其他任务调度的命令。

    Code
    ctrl + z
    可以将一个正在前台执行的命令放到后台,并且暂停

    jobs
    查看当前有多少在后台运行的命令

    bg
    将一个在后台暂停的命令,变成继续执行

    fg
    将后台中的命令调至前台继续运行
  2. nohup 命令(推荐)

    Code
    用途:不挂断地运行命令。
    语法:nohup Command [ Arg … ] [ & ]
    描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部
    ---------------------------------------
    如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。 该命令的一般形式为: 
    nohup conmmand &
    如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
    nohup command > myout.file 2>&1 
    在上面的例子中,输出被重定向到myout.file文件中
    Code
    真实例子:
    $nohup java -jar cygf-web-1.0.1.jar > cygf-web-1.0.1.log 2>&1 &
    [1] 1617
    结束该进程:
    jobs // 找到该进程编号
    fg 1 // 将该进程调回前台界面
    Ctrl+C // 结束该进程

4.19 crontab 定时任务

【测试网址】http://tool.lu/crontab

Code
说明:
Linux
* * * * *
- - - - -
| | | | |
| | | | +----- day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | +---------- month (1 - 12) OR jan,feb,mar,apr ...
| | +--------------- day of month (1 - 31)
| +-------------------- hour (0 - 23)
+------------------------- minute (0 - 59)

使用步骤

Code
crontab -e
*/1 * * * * /home/hadoop/tmp/log_gen.sh

五、用户管理

【转】https://www.cnblogs.com/dubhlinn/p/11055010.html

5.1 用户(组)配置文件

/etc/passwd:用户的配置文件,存放用户信息;从左至右:用户名,密码(不显示明文),用户id,组id,家目录,登录shell。

img

/etc/shadow:口令的配置文件,用于存放加密口令、修改事件、失效时间等信息。

/etc/group:组配置文件,用于存放组名、组id。

5.2 用户

用户分类:

  • 普通用户

  • 超级用户(root)

5.2.1 useradd 创建新用户

用户信息存放再/etc/passwd文件中,包括用户名和ID以及对应的home目录。

Code
[root@centos7 ~]# useradd userName [-d homePath] [-g groupName]

参数介绍:

userName:用户名

homePath:家目录(可选,不指定时默认为/home目录下同用户名)

groupName:组名(可选,不指定时默认为同用户名)

5.2.2 passwd 更改密码

Code
passwd userName

参数介绍:

userName:用户名

5.2.3 id 查看用户信息

id username

Code
[wbw@centos7 /home/wbw]$id wbw
uid=1000(wbw) gid=1000(wbw) groups=1000(wbw)

5.2.4 su 切换用户

Code
su suername

5.2.5 userdel 删除用户

Code
userdel [-r] username

username:为要删除的用户名

-r:是可选项,表示同时删除该用户的家目录。一般情况下删除用户时并不需要删除他的家目录。

5.3 组

组信息存放在 /etc/group

5.3.1 groupadd 添加组

Code
groupadd groupName

其中,groupName为要添加的组名,注意不能重复添加同名的组,如果groupName已经存在,会返回错误提示。

5.3.2 groupdel 删除组

Code
groupdel groupName

其中,groupName为要添加的组名,注意如果这个组是一个或多个用户的主组,则不能删除。

5.3.3 usermod 修改用户所属组

这个是用户的默认所属组

Code
usermod -g groupname userName

其中,groupname为新组名,userName为要修改的用户名。

5.3.4 usermod 修改用户家目录

Code
usermod -d homepath username

其中homepath为新的家目录,username为要修改的用户名。

5.3.5 gpasswd 从组中添加、移除用户

Code
$gpasswd -h
Usage: gpasswd [option] GROUP

Options:
-a, --add USER add USER to GROUP
-d, --delete USER remove USER from GROUP
-h, --help display this help message and exit
-Q, --root CHROOT_DIR directory to chroot into
-r, --delete-password remove the GROUP's password
-R, --restrict restrict access to GROUP to its members
-M, --members USER,... set the list of members of GROUP
-A, --administrators ADMIN,...

添加一个用户到组中

Code
# 先创建一个组
$sudo groupadd grouping1
# 然后将用户加入组中
$sudo gpasswd -a TestUser grouping1
Adding user TestUser to group grouping1
# 查看用户状态
$id TestUser
uid=1003(TestUser) gid=1003(groupTest) groups=1003(groupTest),1006(grouping1)

将用户移出组

Code
# 移除用户从组中
$sudo gpasswd -d TestUser grouping1
Removing user TestUser from group grouping1
# 查看用户状态
$id TestUser
uid=1003(TestUser) gid=1003(groupTest) groups=1003(groupTest)

六、文本操作

6.1 重定向

一般情况下都为标准输入输出

  • 输出重定向

    Code
    ls -l > filelist.txt
    ls -l >> filelist.txt # 追加
  • 输入重定向

    Code
    sort < filelist.txt

6.2 管道机制

使用|符号,可以将一个程序的结果传递给下一个程序作为它的输入,这样的操作可以使我们的程序更加的灵活,例如:

Code
ll | sort

这个例子为将 ll 原本打印在屏幕上的内容,作为 sort 的输入。结果还是打印在屏幕上。如果配合重定向,那么可以直接写到文件中,如:

Code
[wbw@centos7 ~]$ ll | sort > file.txt
[wbw@centos7 ~]$ cat file.txt
-rw-rw-r--. 1 wbw wbw 0 Mar 5 17:45 file.txt
-rw-rw-r--. 1 wbw wbw 58 Mar 5 17:35 filelist.txt
total 4

6.3 more&less

可以查看文本,以及一些快捷操作。类似一个文本查看器。

Code
more 文件名

帮助:

Code
Most commands optionally preceded by integer argument k.  Defaults in brackets.
Star (*) indicates argument becomes new default.
-------------------------------------------------------------------------------
<space> Display next k lines of text [current screen size]
z Display next k lines of text [current screen size]*
<return> Display next k lines of text [1]*
d or ctrl-D Scroll k lines [current scroll size, initially 11]*
q or Q or <interrupt> Exit from more
s Skip forward k lines of text [1]
f Skip forward k screenfuls of text [1]
b or ctrl-B Skip backwards k screenfuls of text [1]
' Go to place where previous search started
= Display current line number
/<regular expression> Search for kth occurrence of regular expression [1]
n Search for kth occurrence of last r.e [1]
!<cmd> or :!<cmd> Execute <cmd> in a subshell
v Start up /usr/bin/vi at current line
ctrl-L Redraw screen
:n Go to kth next file [1]
:p Go to kth previous file [1]
:f Display current file name and line number
. Repeat previous command
-------------------------------------------------------------------------------

6.4 cat & od

cat:文本格式打印

  • -n:行号
Code
[wbw@centos7 ~]$ cat nums.txt 
123456

od:逐字节打印

  • -c、-t c、-t x1、-t d1、-t u1
Code
[wbw@centos7 ~]$ od -t x1 file.txt 
0000000 2d 72 77 2d 72 77 2d 72 2d 2d 2e 20 31 20 77 62
0000020 77 20 77 62 77 20 20 30 20 4d 61 72 20 20 35 20
0000040 31 37 3a 34 35 20 66 69 6c 65 2e 74 78 74 0a 2d
0000060 72 77 2d 72 77 2d 72 2d 2d 2e 20 31 20 77 62 77
0000100 20 77 62 77 20 35 38 20 4d 61 72 20 20 35 20 31
0000120 37 3a 33 35 20 66 69 6c 65 6c 69 73 74 2e 74 78
0000140 74 0a 74 6f 74 61 6c 20 34 0a

6.5 echo

echo:输入什么就打印什么。

Code
[wbw@centos7 ~]$ echo 123456
123456

通常echo配合重定向,快速向文本文件添加信息:

Code
[wbw@centos7 ~]$ echo 123456 > nums.txt
[wbw@centos7 ~]$ cat nums.txt
123456

还可以进行追加:

Code
[wbw@centos7 ~]$ echo append >> nums.txt
[wbw@centos7 ~]$ cat nums.txt
123456
append

6.6 head & tail 显示文件头尾

显示文件前(后)N行信息

Code
head -n 15 ab.c		# 显示ab.c文件前15行
tail -n 15 ab.c

实时打印文件尾部被追加的内容(一般可以用来查看实时日志)

Code
tail -f debug.txt

6.7 tee 抄送

tee:将从标准输入的数据抄送到标准输出,同时存入磁盘文件。

Code
./myap | tee myap.log

6.8 wc 字计数

wc:字计数,可以看文件有多少行数据

Code
# 查看file.txt文件的行数
[wbw@centos7 ~]$ wc -l file.txt
3 file.txt
# 查看有多少个进程数
[wbw@centos7 ~]$ ps -ef | wc -l
119

6.9 sort 排序

sort:排序

具体使用情况用man查看。

6.10 tr 翻译字符

tr:翻译字符

Code
tr string1 string2

将标准输入拷贝到标准输出,string1中出现的字符替换成string2中的对应字符,如:

Code
[wbw@centos7 ~]$ cat file.txt 
-rw-rw-r--. 1 wbw wbw 0 Mar 5 17:45 file.txt
-rw-rw-r--. 1 wbw wbw 58 Mar 5 17:35 filelist.txt
total 4
[wbw@centos7 ~]$ cat file.txt | tr file FILE
-rw-rw-r--. 1 wbw wbw 0 Mar 5 17:45 FILE.txt
-rw-rw-r--. 1 wbw wbw 58 Mar 5 17:35 FILELIst.txt
totaL 4

6.11 正则表达式相关命令

6.11.1 正则表达式

【菜鸟教程】https://www.runoob.com/regexp/regexp-syntax.html

6.11.2 grep

  • -n:显示时每行前面显示行号
  • -v:显示所有不包含模式的行
  • -i:字符比较时忽略字母的大小写

6.11.3 sed

sed -e ‘s/被替换的内容/替换后的内容/g’

  1. 替换操作

    Code
    cat hh.txt | sed [-e 's/被替换的字符串/目标字符串/g']
    ------------------
    g : 一行里面全部
    [] : 可以接着多个替换操作
    Code
    sed -e 's/.*\([0-9][0-9]*\)万/\1/g'
    ------------------
    \(.......\) 里面的内容看成一个整体与\1对应。即两者值相同。如果有多个,\2\3\4依此下去

6.11.4 awk

awk 的一般语法如下:

Code
># awk 'script' filename

此处 'script' 是一个由 awk 可以理解并应用于 filename 的命令集合。

它通过读取文件中的给定行,复制该行的内容并在该行上执行脚本的方式工作。这个过程会在该文件中的所有行上重复。

该脚本 'script' 中内容的格式是 '/pattern/ action',其中 pattern 是一个正则表达式,而 action 是当 awk 在该行中找到此模式时应当执行的动作用{}括起来。

  1. 用法

    Code
    awk '程序' 文件名列表
    awk -f 程序文件名 文件名列表
    程序 条件 {动作}
    awk自动对每行文本执行条件判断,满足条件执行动作(内循环)
    多段程序间用空格或分号隔开

    也可以用重定向流的方式给数据
    ls -s | awk ....
  2. 处理方式

    • 输入文件的每行作为一个“记录”,变量NR就是行号

    • 每行用空格分隔开的部分,叫做记录的“域”

      内置变量$1是第一域的内容,依次$2、$3

    • awk的处理为:符合条件的行,执行相应的动作

      • 条件1:C语言的逻辑关系表达式,<>=!|&
      • 条件2:正则表达式 /regexpr/
      • 特殊条件:
        • 不指定任何条件,默认对所有文本执行动作
        • BEGIN:处理文本前执行的动作
        • END:之后
  3. 动作

    • 自定义变量

    • 加减等算术逻辑运算

    • 正则表达式匹配运算(用作条件判断) ~ !~

      Code
      $2 ~ "[1-9][0-9]*"
      表示第二个域要匹配后面的正则表达式
    • 流程控制:

      Code
      if
      for
      print 变量 变量
      printf("%s", $2) 类C语言

推荐:https://www.cnblogs.com/ftl1012/p/9250541.html

6.12 vi 编辑器

注意:vi命令状态下的按键命令没有回显

  1. 配置(也可以直接修改配置文件)

    Code
    :set number		显示行号
  2. 光标单字符移动

    Code
    5h		光标左移5列
    6j 光标下移6行
    23k 光标上移23行
    10l 光标右移10列
  3. 行首行尾

    Code
    Ctrl-b		向后翻页(PgDn)
    Ctrl-f 向前翻页(PgUp)
  4. 快速移动

    • 行首行尾

      Code
      ^		行首
      $ 行尾
    • 移动一个单词

      Code
      w		右移
      b 左移
      也可以前面跟数字 5w 6b
    • 移动指定行

      Code
      :256 + 回车		定位到256行
  5. 删除命令

    Code
    x		删除光标处字符
    dd 删除当前行
    3dd 删除当前行开始的3行
  6. 字符替换 r

    Code
    ra		当前光标字符替换为a
    rarbrc 当前光标位置替换为abc
  7. 撤销(undo)

    Code
    u
  8. 重复上次操作

    Code
    .
  9. 存盘

    Code
    ZZ <==> :wq		保存退出
    :W 仅保存
    :q! 退出不保存
  10. 文件操作

    • 读入文件xyz.c插入到当前行下

      Code
      :r xyz.c
    • 写文件,把第50行至行尾的内容写到文件file1中(可以用在编辑了半天文件,发现没有权限修改时候用)

      Code
      :50,$w file1
      :50,$w! file1 强制覆盖
  11. 剪贴板

    • 删除,并拷贝到剪贴板

      Code
      :10,50d		删除第10-50行
      :1,.d 删除文件首至当前行的部分
      :,$d 删除当前行至文件尾
    • 不删除,仅拷贝

      Code
      :10,50y
    • 粘贴剪贴板

      Code
      p
  12. 查找

    Code
    /pattern
    例子:/[0-9][0-9]*
    ----------------------
    n 向下继续查找
    N 向上查找
    循环模式,当到达文件尾时,返回文件头继续搜索
  13. 替换

    Code
    :n1,n2s/pattern/string/g
    例子:
    :1,50s/abc/xyz/ 仅替换一次
    :1,50s/abc/xyz/g 替换所有
    :50,80s/^/ / 右移4列
    :50,80s/^ // 左移4列
    :1,$s/ *$// 消除尾巴多余的空格
    --------------------
    注意:编辑c文件的时候要小心s/a[i]/b[j]/g 这里只匹配ai,也不能把s/a*b/x+y/g。需要用转移字符\
  14. 其他操作

    Code
    J		行合并,当前行以及下一行合并
    Ctrl-l 刷新屏幕(防止其他程序打印消息打乱文件内容)
    Cirl-g 打印当前文件的名字,总行数,当前行号,文件是否被修改等信息

七、文件目录管理

7.1 文件信息

Code
例:$ls -l arg
-rw-rw-r--. 1 wbw wbw 390 Feb 26 21:09 anthorized_keys
drwxrwxr-x. 5 wbw wbw 4096 Mar 29 16:47 downloads
1rwxrwxrwx. 1 root sys 11 Jul 11 07: 31 unix->/stand/unix
crw-r--r--. 1 bin ter 0, 9 Oct 18 09: 56 /dev/tty10
prw-r--r--. 1 root sys 2642 ct1811:07 /tmp/pipe

第1列:文件属性
◆第1字符为文件类型
* -普通文件
* b块设备文件(Block)
* d目录文件(Dir)
* c字符设备文件(char)
* l符号连接文件(Link)
* p命名管道文件(Pipe)
◆后面9个字符为文件的访问权限(rwx-读权限,写权限,可执行权限,无权限)
* 2-4字符:文件所有者对文件的访问权限
* 5-7字符:同组用户对文件的访问权限
* 8-10字符:其它用户对文件的访问权限
第2列:文件link数,涉及到此文件的目录项数
第3列,第4列:文件所有者的名字和组名
第5列:
◆普通磁盘文件:列出文件大小(字节数)
◆目录:列出目录表大小,不是目录下文件长度和
◆符号连接文件:列出符号连接文件自身的长度
◆字符设备和块设备文件:列出主设备号和次设备号
第6列:文件最后一次被修改的日期和时间
第7列:文件名

7.2 文件比较

  • MD5

  • SHA-1

  • diff 求出两个文件的差别

    Code
    diff file1 file2
    diff -u file1 file2 (-u后面跟数字表示,打印多少行一样的)

7.3 文件权限管理

7.3.1 chown 修改所有者

Code
chown [-R] username source

其中,username为修改后的用户名,source为文件或目录的路径名称,-R表示级联修改目录下面的子目录和文件的所有者。

7.3.2 chgrp 修改所在组

Code
chgrp [-R] groupname source

其中,groupname为修改后的组名,source为文件或目录的路径名称,-R表示级联修改目录下面的子目录和文件的所在组。注意修改文件的所有者和所在组是相互独立的事件,互不影响。

7.3.3 同时修改所有者和所在组

Code
chown [-R] username:groupname source

其中,username为修改后的用户名,groupname为修改后的组名,source为文件或目录的路径名称,-R表示级联修改目录下面的子目录和文件的所在组。这里的用户和组没有必然联系,即username不一定要属于groupname的那个组。

7.3.4 chmod 修改文件权限

(1) 使用权限代码赋值

chmod role1=auth source

其中,role为角色代码,可以设置其中的一个或多个,多个角色之间用逗号(,)分隔且不能有空格,其取值范围如下:

Code
u-文件或目录的所有者;
g-文件或目录所在组的用户;
o-其他用户;
a-所有用户,包含u、g、o,只能单独使用。

auth为权限码组合,例如读写执行权限为rwx,读和执行权限为rx,写权限为w,根据需要选择。

source为文件或目录的路径名称。

下面是几个实例:

Code
chmod u=rwx,g=rx,o=rx /home/dubhlinn
chmod o=r /home/dubhlinn/description.txt
chmod a=rwx /home/public

(2) 使用加减号添加或减少权限

chmod role+auth source

chmod role-auth source

role、auth、source的含义同上,同样可以设置一个或多个角色,以下是几个实例:

Code
chmod u-x,g+rw /home/dubhlinn/description.txt
chmod a+w /home/public
chmod u+rwx,g-x,o-x /home/dubhlinn

(3) 使用数字赋值

chmod xyz source

其中,x、y、z是三个数字,分别表示文件或目录的所有者、所在组的用户、其他组的用户的”权限值”。

权限值是这样计算的:

Code
r=4
w=2
x=1

将这个用户的权限代码对应的数字加起来就是”权限值”,所以其取值范围可能是0、1、2、3、4、5、6、7。

例如:

Code
chmod 754 /home/void 
等价于
chmod u=rwx,g=rx,o=r /home/void

7.4 STICKY 粘着位(防删除)

Code
drwxrwxrwt.  33 root root 4096 Apr 22 14:02 tmp

目录有写权限并且带STICKY属性,此目录下的文件仅文件主可以删除,其他用户删除操作会失败。

7.5 SUID

【转】https://www.jianshu.com/p/71acd8dad454

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。

八、网络管理

8.1 ip addr IP配置信息

  1. 配置联网

    • 查看当前网卡名称 (ip addr)

      avatar

    • 进入网络配置文件的目录(cd /etc/sysconfig/network-scripts) (ls)

    • 编辑网络配置文件(vi ifcfg-ens33)

      Code
      修改配置文件:
      BOOTPROTO=static
      ONBOOT=yes
      添加:
      IPADDR=本机IP
      NETMASK=255.255.255.0
      GATEWAY=NAT模式网关IP
      DNS1=8.8.8.8
    • 再重新启动网络配置(service network restart)

    • 测试网络是否畅通(本地PING 虚拟机IP,虚拟机ping外网)

8.2 ping 计算机连通性

测试本机与网络中其他计算机的连通性。

Code
$ping wangbowen.cn
PING wangbowen.cn (47.107.232.108) 56(84) bytes of data.
64 bytes from 47.107.232.108 (47.107.232.108): icmp_seq=1 ttl=128 time=24.0 ms
64 bytes from 47.107.232.108 (47.107.232.108): icmp_seq=2 ttl=128 time=22.6 ms
64 bytes from 47.107.232.108 (47.107.232.108): icmp_seq=3 ttl=128 time=23.1 ms

8.3 netstat 网络(端口)状态

  1. 安装

    Code
    $ sudo yum install -y net-tools
  2. 查看

    Code
    $ netstat
  3. 查看端口占用情况

    Code
    $ netstat -lntp

8.4 hostname/hosts 主机名、映射

  1. 更改主机名

    Code
    vi /etc/hostname
    将里面的内容替换为需要的主机名
  2. 配置主机名(域名)映射文件

    Code
    vi /etc/hosts
    新增:
    127.0.0.1 localhost
    192.168.xxx.xxx XXX

8.5 firewalld 防火墙

  1. 服务的启动与关闭

    Code
    systemctl enable firewalld.service	//"开机启动"启用
    systemctl disable firewalld.service //"开机自启"禁用
    systemctl start firewalld.service //启动防火墙
    systemctl stop firewalld.service //停止防火墙
  2. 重新加载配置

    Code
    firewall-cmd --reload
  3. 查看状态

    Code
    systemctl status firewalld.service	//查看防火墙状态
  4. 查看所有配置

    Code
    firewall-cmd --list-all
  5. 查看当前开放的端口

    Code
    firewall-cmd --zone=public --list-ports
  6. 查看某个端口是否开放

    Code
    firewall-cmd --zone=public --query-port=80/tcp
  7. 开放指定端口

    以开放80端口为例:

    Code
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd --reload
  8. 移除端口

    以开放80端口为例:

    Code
    firewall-cmd --zone=public --remove-port=80/tcp --permanent
    firewall-cmd --reload
  9. 查看允许指定IP访问的端口规则

    Code
    firewall-cmd --zone=public --list-rich-rules
  10. 开放指定端口(只允许指定IP访问)

    以“只允许192.168.1.1的主机连接3306端口”为例:

    Code
    firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="3306" accept" --permanent
    firewall-cmd --reload
  11. 移除端口(只允许指定IP访问)

    以“移除只允许192.168.1.1的主机连接3306端口”为例:

    Code
    firewall-cmd --remove-rich-rule="rule family="ipv4" source address="192.168.1.1" port protocol="tcp" port="3306" accept" --permanent
    firewall-cmd --reload

九、程序命令

9.1 运行时获取信息方式

  1. 配置文件

    一般较复杂的程序会提供配置文件以存储配置信息或者偏好配置信息,分为系统级偏好设置和用户级偏好设置。

例如 bash 的 /etc/profile~.bash_profile

配置文件提供了灵活性(同一个程序文件因用户不同读取的配置文件不同而表现不同),变更这些信息不很方便,一般不需要变化的配置信息或选项信息存入配置文件,持久化存储

  1. 环境变量

    命令env可以打印出当前的环境变量。

    一般是些与“环境”相关的配置或选项信息,信息量不大。这些选择在一段时间内反复使用同一个命令或者不同命令时保持不变。

    虽然运行的程序(可执行文件)是完全相同的一个文件,程序通过获得环境变量感知环境的不同,控制自己的行为。

    性能问题:比读取配置文件需要的系统开支要小。(但是越来越多的用配置文件)

  2. 命令行参数(三种风格)

    • 类似find和gcc的风格(gcc -O0 -Wall -c shudu.c)

    • 类似dd命令风格(dd if=/dev/urandom of=test.dat)

    • 类似ls和grep风格(现今流行)

      Code
      ls --classify --all --site --human-readable --width=80 /home/jiang长选项
      ls -Fashw80 /home/jiang 多个选项挤在一起
      ls -F -a -s -h -w 80 /home/jiang 多个选项分开
      ls -F -w80 /home/jiang -has 可以把选项放到后面
      用独立的命令行参数--显式地标识选项结束
      选项的处理统一由C语言标准动态链接库libc.so中库 getopt函数_long()完成
  3. 人机交互方式(Linux很少用)如C语言的scanf

9.2 启动 bash

自动执行的一批命令

用户偏好

Code
[wbw@centos7 /home/wbw]$ls -al
total 48
drwx------. 15 wbw wbw 4096 Apr 22 13:09 .
drwxr-xr-x. 5 root root 45 Mar 20 22:17 ..
-rw-------. 1 wbw wbw 2663 Apr 16 23:36 .bash_history
-rw-r--r--. 1 wbw wbw 18 Aug 8 2019 .bash_logout
-rw-r--r--. 1 wbw wbw 193 Aug 8 2019 .bash_profile
-rw-r--r--. 1 wbw wbw 258 Mar 11 23:56 .bashrc
  • 当bash作为注册shell被启动时:自动执行用户主目录下的 .bash_profile
  • 退出时: .bash_logout
  • 交互式: .bashrc

系统级

  • 注册shell(启动时):/etc/profile
  • 交互式shell:/etc/bash.bashrc
  • 注册shell(退出时):/etc/bash.bash.logou

9.3 Shell 编程

9.3.1 变量

  • 变量名和等号之间不能有空格。

  • 不能使用bash里的关键字(可用help命令查看保留关键字)

赋值(定义变量)

shell
addr=1.1.1.1

引用(使用变量)

使用一个定义过的变量,只要在变量名前面加美元符号即可。但注意,第二次赋值的时候不能写$your_name=”alibaba”,使用变量的时候才加美元符。

命令行中有$符号的变量引用,会先被完成替换。

引用未定义的变量,变量值为空字符串。

shell
$addr 或 ${addr}

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

shell
myUrl="http://www.google.com"
readonly myUrl

删除变量

使用 unset 命令可以删除变量。语法:

shell
unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

9.3.2 命令替换

shell
now=`date`
# 以date命令的stdout替换`date`

9.3.3 位置参数

shell
$0		# 脚本文件本身的名字
$1 $2 # 第一个命令行参数、第二个命令行参数
$# # 命令行参数的个数
$* # 等同于 "$1 $2 ...",把所有参数连在一起的字符串
$@ # 等同于 "$1" "$2" ...,用于把变长的命令行参数传递给其他命令
shift # 左移,即丢弃第一个参数,第二个参数代替第一个参数。以此类推

9.3.4 字符串

单引号

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

    示例:

    shell
    # 打印:Don't remvoe dir "C:\PETER"!
    $echo 'Don'\''t remove dir "C:\PETER"'

双引号

除$和`外特殊字符的特殊含义被取消,用于替换。需要转义的有:

Code
\"
\$
\'
\\

字符串长度

shell
string="abcd"
echo ${#string} #输出 4

子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:

shell
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

注意:第一个字符的索引值为 0

9.3.5 数组

shell
my_array=(A B "C" D)

echo "第一个元素为: ${my_array[0]}"

9.3.6 注释

Code
# .....

9.3.7 流程控制

可以用 [ ] 来作为一个条件判断!?

命令组合的两种方式:

  • { list;} :
    • 在当前shell中执行一组命令。
    • 左花括号后必须有一个空格!
    • 多行并为一行一定要注意有分号
  • (list) :在子shell中执行一组命令
条件判断

test 文件特性检查

Code
test -t /etc/motd		# 判断该文件是否可读可执行
[ -r /etc/mortd ] # [是一个命令,要有空格

参数:
-f:普通文件
-d:目录文件
-r:可读
-w:可写
-x:可执行
-s:size>0

字符串的比较

Code
# 注意!一定要在等号左右加空格
str1 = str2
str1 != str2

整数的比较

Code
-eq		=
-ne !=
-gt >
-ge >=
-lt <
-le <=

复合条件

Code
!	:NOT(非)
-o :OR(或)
-a :AND(与)
if-else

if

if 语句语法格式:

Code
if condition
then
command1
command2
...
commandN
fi

写成一行(适用于终端命令提示符):

Code
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

末尾的fi就是if倒过来拼写,后面还会遇到类似的。

TIP:有时候为了图方便也可以这样

Code
[ true ] && command
如果条件正确,执行command

if else

if else 语法格式:

Code
if condition
then
command1
command2
...
commandN
else
command
fi

if else-if else

if else-if else 语法格式:

Code
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

以下实例判断两个变量是否相等:

Code
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi

输出结果:

Code
a 小于 b

if else语句经常与test命令结合使用,如下所示:

Code
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi

输出结果:

Code
两个数字相等!
case 多条件分支
Code
case word in
pattern1) list1;;
pattern2) list2;;
...
*) list3;;
esac

其中;;是一个整体

for 循环

与其他编程语言类似,Shell支持for循环。有break,break2,continue,exit 0(返回码,不一定是0)

for循环一般格式为:

Code
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

写成一行:

Code
for var in item1 item2 ... itemN; do command1; command2… done;

当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

例如,顺序输出当前列表中的数字:

Code
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done

输出结果:

Code
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

顺序输出字符串中的字符:

Code
for str in 'This is a string'
do
echo $str
done

输出结果:

Code
This is a string

*没有 for (i=0;i<n;i++)语法,但是可以用seq命令生成序列: *

Code
for i in `seq 1 254`
do
...
done
while 语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

Code
while condition
do
command
done

以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。

Code
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done

运行脚本,输出:

Code
1
2
3
4
5

以上实例使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令

9.3.8 expr 表达式运算

shell不支持除字符串意外的数据类型,不支持四则运算等!需要这些功能,借助于shell外的可执行程序/usr/bin/expr实现,为了提高执行效率这里内置了。也可以实现自己的命令来达到复杂运算的目的。

如果直接进行运算会出问题,简单的加法运算如下,需要用到expr命令:

shell
#!/bin/bash
x=`expr 1 + 2`
echo "${x}"

运算表达式:

Code
括号
()
算数运算
+ - * / %
关系运算
> >= < <= = !=
逻辑运算
| &
正则表达式运算
"待匹配字符串" : '匹配模式'

注意:

  • 应该有空格的地方不允许漏掉

  • 应该转义的地方必须要加反斜线,如计算 3*(1+2),和1<2判断:

    Code
    #!/bin/bash
    x=`expr 3 \* \( 1 + 2 \)`
    echo "x = ${x}, `expr 1 \< 2`"

    # 这里的*会被翻译成通配,所以要转移成普通的*表示乘法运算
    # 这里<是重定向,因此需要转移

9.3.9 eval 命令

将参数以命令的方式运行:

Code
#!/bin/bash
read line
eval "$line"
Code
输入 
echo hello world

结果
hello world

9.3.10 函数

语法:

Code
name() {list;}

参数引用:

  • 函数定义完成后,该函数名作为一个自定义内部命令执行,后面可以调用。

  • 调用时函数名后附加上0到多个参数

  • 在函数体内部以$1 , $2 等方式引用

返回值

Code
return 0

0: 成功
非0:失败

十、文件系统

10.1 文件系统的创建和安装(挂载)

10.1.1 U盘挂载

教程:https://www.jianshu.com/p/74b8a204b36f

主要命令

Code
fdisk -l		// 列表
mount // 安装
umount [-l] // 卸载

10.1.2 新增磁盘

教程:https://blog.csdn.net/hanpengyu/article/details/7475645

主要命令

Code
fdisk
mkfs [-t]

10.2 文件系统的结构

把整个逻辑设备以块(扇区)为单位划分,编号0,1,2……(每块512字节或其他更大的2^n字节大小,因此不能取1字节,最小也要取512)

avatar

  • 引导块(0号块):用于启动系统,只有根文件系统的引导块有效

  • 专用块(1号块):也叫管理块,或者超级块

    • 存放文件系统的管理信息。

      如:文件系统的大小,i节点区的大小,空闲空间大小,空闲块链表的头等等

    • mkfs命令时初始化,df命令读出部分信息,df-i和df

  • i节点区:i节点(index node,简记为i-node)

    • 每个文件都对应一个i节点,i节点中的信息包括:

      指向文件存储区数据块的一些索引(index)

      指针(组成文件的逻辑块与硬盘的物理块之间的映射)

      文件类型,属主,组,权限,link数,大小,时戳(i节点内不含文件名)

    • i节点信息查看

      Code
      [wbw@s201 /home/wbw]$stat anthorized_keys 
      File: ‘anthorized_keys’
      Size: 390 Blocks: 8 IO Block: 4096 regular file
      Device: fd00h/64768d Inode: 17284854 Links: 1
      Access: (0664/-rw-rw-r--) Uid: ( 1000/ wbw) Gid: ( 1000/ wbw)
      Context: unconfined_u:object_r:user_home_t:s0
      Access: 2020-02-26 21:08:42.211841272 +0800
      Modify: 2020-02-26 21:09:17.293839845 +0800
      Change: 2020-02-26 21:09:17.293839845 +0800
  • 数据存储块:每块可容若干个i节点,每个节点的大小是固定的(比如64字节)

10.3 目录存储结构

  • 目录表

    • 每个目录表也作为一个文件来管理,存于“文件存储区”种,有其自己的i节点和数据存储块

    • 目录表由若干个“目录项”构成,目录项只含有两部分信息:文件名,i节点号

      目录表和i节点两级结构:

      avatar

      • 目的:分开存放为了提高目录检索效率
    • 用ls命令列出的目录大小是目录表文件本身的长度

  • 软(硬)链接:参考 4.9 ln 链接

文章作者: IT小王
文章链接: https://wangbowen.cn/2020/02/28/Linux%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT小王

评论