Linux入门看着一篇就文章就够了

文章目录

      • Linux 基本操作
        • 一、用户
          • root用户
          • 普通用户
          • 如何区分root用户和普通用户?
        • 二、终端terminal
        • 三、 什么是shell
        • 四、Linux 执行命令
          • shell中可执行的命令分为内部命令和外部命令
        • 五、Hash缓存表
        • 六、命令别名
        • 七、日期和时间
        • 八、命令格式
        • 九、获得帮助
        • 十、命令集
        • 十一、文件管理命令
          • 文件查找和压缩
            • 字符串替换命令
          • cut命令,类比字符串截取
            • sort, 排序命令。
            • head读取文件头部信息。
        • Shell 脚本编程
            • 1、编程基础
            • 2、变量使用
            • 3、 局部变量
            • 4、环境(全局)变量
            • 5、只读和位置变量
            • 6、 参数传递
            • 7、退出状态
            • 8、算数运算
            • 9、条件测试
        • 检查磁盘占用率的检查脚本案例。
            • 小括号和花括号的区别

Linux 基本操作

一、用户

root用户

一个特殊的管理账户,也被称为超级用户,root已接近完整的系统控制,对系统损害的几乎无限的能力。除非必要,不要登录为root。

普通用户

权限有限,造成损害的能力比较有限。

如何区分root用户和普通用户?

1、命令提示符为**#** 就是root用户,$ 就表示普通用户。
2、使用id -u 命令查看uid,如果为0就是root用户,非0就是普通用户。

可以修改提示符:
通过命令:echo $PS1, 查看PS1的格式。
直接在命令行:执行PS1=自定义格式,就可以改变提示符。

二、终端terminal

虚拟终端,在远程连接linux时,可以打开多个窗口,使用tty查看当前窗口是哪个终端。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# tty
/dev/pts/1
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# tty
/dev/pts/2

shell 将linux命令中的单词,解释成计算机可以理解的二进制。shell有各种不同的版本类型。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

三、 什么是shell

shell是linux系统的用户界面, 提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
shell是linux的命令解释器。
shell是一种高级程序设计语言。

四、Linux 执行命令

输入命令后回车,shell程序找到键入命令对应的可执行程序或代码,并由其分析后提交给内核分配资源将其运行起来。

shell中可执行的命令分为内部命令和外部命令

内部命令:由shell 自带的,而且通过某命令形式提供。
help 命令可以查看内部命令列表。
enable cmd: 启动内部命令。cmd是某个命令
enable -n cmd: 禁用内部命令。
enable -n: 查看所有禁用的内部命令。
外部命令:在文件系统路径下有对应的可执行程序文件。

内部命令在内存中,外部命令在磁盘里。

区别指定的命令是内部还是外部命令:
type COMMAND
示例:

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# type who
who is /usr/bin/who     // 不是内部命令   
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# type pwd
pwd is a shell builtin   // 是内部命令

五、Hash缓存表

系统初始hash表为空,当外部命令执行时,默认会从PATH 路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行,如果不存在,将会去path路径下寻找,利用hash缓存表可大大提高命令的调用速率。

hash命令常见用法:

hash 显示hash缓存
hash -l 显示hash缓存,可作为输入使用。
hash -p path  name将命令全路径path起别名name。
hash -t name 打印缓存中name的路径。
hash -d name 清除name缓存。
hash -r 清除缓存。

六、命令别名

如果一个命令特别长,可以尝试这给这个命令起一个别名。
定义别名alias name(别名)=‘长命令’
查看所有定义的别名:·alias

在命令行定义的别名,仅对当前shell进程有效。

如果想永久有效,要定义在配置文件中。

仅对当前用户配置文件有效修改: ~/.bashrc
对所有用户配置文件有效修改:etc/.bashrc

删除别名命令unalias 别名
添加配置文件后,要想生效,还需要通过. 文件路径使修改生效。

命令执行的优先级: 别名 > 内部命令 > hash 表 > 外部命令 > 命令找不到

如果别名同原命令同名,如果要执行原命令,可使用下面命令(任意一种都可以):

\ALIASNAME
"ALIASNAME"
'ALIASNAME'
command ALIASNAME
/path/command  ------命令路径,只适合外部命令

七、日期和时间

1、 linux 的两种时钟:

  • 系统主板:由Linux内核通过CPU的工作频率进行的。
  • 硬件时钟:主板

2、操作系统时间查看命令:date

[root@iZ2ze6xkq7xjxmfnsdw27yZ network-scripts]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

设置系统时间命令:date MMDDHHmmYYYY.ss

MM:月;DD:天;HH:小时;mm:分;YYYY:年份;ss:秒

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# date 091012502020.30
Thu Sep 10 12:50:30 CST 2020

硬件时间查看命令:clock

-s ,–hctosys 以硬件时钟为准,矫正系统时钟。
-w,–systohc 以系统时钟为准,矫正硬件时钟。

[root@iZ2ze6xkq7xjxmfnsdw27yZ network-scripts]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

3、 时区:/etc/localtime

查看系统时区:

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# ll /etc/localtime 
lrwxrwxrwx 1 root root 33 Oct  8  2019 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

查看所有时区列表:

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers

设置系统时区:

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# timedatectl set-timezone Pacific/Pohnpei
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# date
Tue May 19 00:41:22 +11 2020
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# ll /etc/localtime
lrwxrwxrwx 1 root root 37 May 19 00:41 /etc/localtime -> ../usr/share/zoneinfo/Pacific/Pohnpei

4、 显示日历:

cal: 当月日历。
cal -y: 当年日历。
cal 2019: 2019年日历
cal 08 2008: 2008年8月日历

八、命令格式

COMMAND [OPTIONS(选项)...] [ARGUMENTS(参数)...]

选项:用于启动或关闭命令的某个或某些功能。
短选项: -c 例如:-l , -h
长选项:–word 例如:–all ,–human-readable

参数:命令的作用对象,比如文件名、用户名等。

九、获得帮助

  • 获取帮组的能级决定了技术的能力!
  • 多层次的帮助。

1、whatis + command : 查看命令是干嘛的。
命令查询是从数据库中获取的,如果刚安装好的系统是还没创建好数据库的。
在centos7上可以使用mandb 创建。
在centos6上可以使用makewhatis 创建。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# whatis  rm 
rm (1)               - remove files or directories

2、command -- help
内部命令使用: help + command

3、man 帮助,通过whatis 查看命令所属的章节,然后通过man [章节] keyword 查看帮助。
man对应的章节:

1:用户命令
2:系统调用
3:C库调用
4:设备文件及特殊文件
5:配置文件格式
6:游戏
7:杂项
8:管理类的命令
9:Linux内核API

十、命令集

1、查看用户id命令:id -u

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# id -u
0

2、查看当前窗口终端:tty

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# tty
/dev/pts/1

3、查看当前系统版本:cat /etc/centos-release

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# cat /etc/centos-release
CentOS Linux release 7.7.1908 (Core)

lsb_release -a

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.7.1908 (Core)
Release:	7.7.1908
Codename:	Core

4、查看系统内核版本:uname -r

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# uname -r
3.10.0-1062.1.2.el7.x86_64

5、查看cpu命令:lscpu
6、查看内存大小命令:free -h
7、查看硬盘大小命令:lsblk
8、 当前登录用户是谁命令:

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# whoami
root
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# who am i
root     pts/1        2020-05-17 21:48 (183.202.3.248)

9、查看有多少人登录服务器的命令:who

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# who
root     pts/1        2020-05-17 21:48 (183.202.3.248)
root     pts/2        2020-05-17 22:13 (183.202.3.248)

10、查看系统支持的shell类型: cat /etc/shells

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

11、查看系统默认使用的shell类型:echo $SHELL

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo $SHELL
/bin/bash

12、注销命令:exitlogout。快捷键:crtl + d
13、清屏命令: clear ,快捷键: Crtl + L
14、查看命令所在路径:whereis command(命令)

[root@iZ2ze6xkq7xjxmfnsdw27yZ network-scripts]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

15、关机命令:halt , poweroff
16、重启: reboot

-f : 强制,不调用shutdown。
-p:切断电源

17、关机或重启: shutdown

shutdown [OPTION] [TIME] [MESSAGE]
-r: reboot
-h:halt
-c: cancel

TIME :无指定,默认相当于 + 1 (CentOS7)
now:立刻 ,相当于 + 0;
+m : 相对时间表示法,几分钟之后;
hh:mm: 绝对时间表示,指明具体时间。

示例: 五分钟后关机

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# shutdown -r +5
Shutdown scheduled for Mon 2020-05-18 21:59:33 CST, use 'shutdown -c' to cancel.

取消关机

shutdown -c

Broadcast message from root@iZ2ze6xkq7xjxmfnsdw27yZ (Mon 2020-05-18 21:54:48 CST):

The system shutdown has been cancelled at Mon 2020-05-18 21:55:48 CST!

18、远程协助screen命令:
screen默认没有安装,进行安装:

yum -y install screen 

创建新的screen会话:
screen -S [SESSION(随便自定义)]

显示所有已经打开的screen会话:
screen -ls

加入screen 会话:
screen -x [SESSION]

退出screen会话:
exit

临时退出screen会话:
ctrl +a,d

恢复某screen会话:
screen -r [SESSION]

18、echo 命令,输出后面的字符串,显示字符。

  • -E (默认)不支持 \ 解释功能。
  • -n 不自动换行。
  • -e 启用\ 字符的解释功能。

显示变量:

echo “$VAR_NAME” : 变量会替换,弱引用。
echo "$VAR_NAME" : 变量不会替换,强引用。

示例:

hello[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo "$PATH"
/usr/local/jdk1.8.0_231/bin:/usr/local/node/bin:/data/mysql/bin:data/mysql/lib/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/webserver/nginx/sbin:/usr/local/rabbitmq/rabbitmq_server-3.6.15/sbin:/usr/local/erlang/bin:/root/bin
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo '$PATH'
$PATH

启用命令选项-e, 若字符中出现以下字符,则特别加以处理,而不会将它当成一般文字输出。

\a   ------------>发出警告声
\b   ------------>退格键
\c   ------------>最后不加上换行符号
\n   ------------>换行且光标移至行首
\r   ------------>回车,即光标移至行首,但不换行。
\t  ------------>插入tab
\\  ------------> 插入\ 字符
\0nnn   ------------>插入nnn(八进制)所代表的ASCII字符。
\xHH   ------------>插入HH(十六进制)所代表的ASCII数字。

19、命令行扩展符号:$()``

将一个命令的输出打印给另一个命令的参数。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo "This system's name is $(hostname)"
This system's name is iZ2ze6xkq7xjxmfnsdw27yZ

括号扩展:{}

打印重复字符串的简化形式

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo file{1,3,5}
file1 file3 file5

19、 查看历史命令:history

n : 显示最近的n条历史。
-c  清除内存历史列表。
-d  通过编号删除对应的历史命令。
-a 将内存中的历史命令添加到历史文件中。
-r 将文件中的历史命令添加到内存历史命令中。
-n 读取

20、命令行历史

  1. !string 重复前一个以 “string”开头的命令。
  2. !?string 重复前一个包含string的命令。
  3. !string:p 仅打印命令历史,而不执行。
  4. ! : p 打 印 输 出 ! :p打印输出! :p! (上一条命令的最后一个参数)的内容。
  5. !:p 打印输出 ! (上一条命令的所有参数)的内容。
    6.^string 删除上一条命令中的第一个string。
    7.^string1 ^string2 将上一条命令中的第一个string1替换为string2。
    8.!:gs/string1/string2 将上一条命令中所有的string1都替换为string2。
    9、atrl + r: 搜索历史。
    21:同步其他服务器的时间:ntpdate ip

22、快捷键:

crtl + l : 清屏: 相当于clear命令。
ctrl + o : 执行当前命令,并重新显示本命令。
ctrl + s :阻止屏幕输出,锁定。
ctrl + q : 解锁,允许屏幕输出。
ctrl + c : 终止命令。
ctrl + z :挂起命令
ctrl + a :光标移动到命令行首,相当于home。
ctrl + e : 光标移动到命令行尾,相当于End
ctrl + f : 光标向右移动一个字符。
ctrl + b:光标向左移动一个字符
Alt + f: 光标向右移动一个单词尾
alt + b:光标向左移动一个单词首
ctrl + xx: 光标在命令行首和光标之间移动。
ctrl + u:从光标处删除至命令行首。
ctrl + k :从光标处删除至命令行尾。
alt + r :删除当前整行

十一、文件管理命令

1、 文件系统结构:

etc目录: 配置文件目录。
boot目录:引导文件存放目录,内核文件、引导加载器都存放于此目录。
home目录: 存放用户数据
dev目录: 存放硬件设备。
bin目录: 所有用户使用的进本命令;不能关联至独立分区,OS启动即会用到的程序。
sbin目录: 存放二进制程序,给系统管理员用的。
tmp目录: 临时数据
usr目录: 操作系统大部分数据。
var目录: 可变的内容数据,日志文件等。
proc目录: 进程数据,内存相关的。
sys目录:系统硬件相关内容。
root目录: 管理员的家目录。
media目录:便携式移动设备挂载点。

定义文件颜色的配置文件目录:cat /etc/DIR_COLORS

2、查看当前工作目录命令:pwd

-P :查看真是物理路径。
-L:显示链接路径(默认)。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# pwd
/root

3、查看路径上的基名和目录名:
基名:basename
目录名:dirname

4、改变文件目录命令:cd
回到刚才的目录:cd -
5、列出目录内容命令:ls

-i: 列出文件结点编号。
-a: 所有文件。
-l: 文件信息。

6、文件通配符

* 匹配零个或多个字符。
?匹配任何单个字符。
~当前用户家目录。
~mage 用户mage 家目录。
~+ 当前工作目录。
~-  前一个工作目录。
[0-9]: 匹配数字范围。
[a-z]:字母
[A-Z]:字母
[wang]:匹配列表中的任何一个字符。
[^wang]:匹配列表中不包含列表中的字符。

案例: 批量创建文件。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# touch f{a..z}.txt
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls
fa.txt  fd.txt  fg.txt  fj.txt  fm.txt  fp.txt  fs.txt  fv.txt  fy.txt
fb.txt  fe.txt  fh.txt  fk.txt  fn.txt  fq.txt  ft.txt  fw.txt  fz.txt
fc.txt  ff.txt  fi.txt  fl.txt  fo.txt  fr.txt  fu.txt  fx.txt

查看上一个工作目录:

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls ~-
dbbackjava  dbbackVue  dbVue

7、查看文件状态命令:stat

[root@iZ2ze6xkq7xjxmfnsdw27yZ dbblog]# stat dbVue/
  File: ?.bVue/?
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d	Inode: 1973045     Links: 3
Access: (0755/drwxr-xr-x)  Uid: ( 1004/elasticsearch)   Gid: (    0/    root)
Access: 2020-09-10 12:50:45.144433566 +0800
Modify: 2020-04-13 16:01:39.042415091 +0800
Change: 2020-04-13 16:01:39.042415091 +0800
 Birth: -

8、复制文件命令: cp

将一个目录下的文件,拷贝到别的目录下,并且重命令。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# .cp /etc/fstab /data/fstab.bak
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls
fstab.bak

将多个文件,复制到目录文件夹下:

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cp /etc/fstab  /etc/profile /root/anaconda-ks.cfg /data/abc/

-r -R: 递归选项。可以将目录下的所有文件,都复制到另一个文件夹下。

-a : 归档(保留文件的各种属性,例如文件权限、创建时间等),相当于-dR --preserv==all。可以复制文件夹。

-v :显示复制过程。

将/etc 目录都拷贝到data目录下。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cp -av /etc /data

-d: --no -dereference --preserv=links ,不复制原文件,只复制链接名。

-b: 目标存在,覆盖前先备份。

f1文件已存在,复制后,有了f1~备份。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls
abc  etc  f0  f1  f2  f3  fstab.bak
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cp -b f0 f1
cp: overwrite ?.1?. y
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls
abc  etc  f0  f1  f1~  f2  f3  fstab.bak

–backup=numbered :目标存在,覆盖前先进行备份。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cp /etc/fstab f1 --backup
cp: overwrite ?.1?. y
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls
f1  f1~

9、移动和重命名文件:mv

常用选项:

-i : 交互式。
-f: 强制。
-b: 目标存在,覆盖前先备份。

在同一个目录下,就是改名。将f1改名那个f2.

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# mv f1 f2
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls
f1~  f2  rootdir

10、删除命令:rm

常用选项:
-i:交互式。
-r: 递归删除。一般目录需要使用该选项。
-f: 强制删除。

生产中建议不使用rm命令,可以通过mv命令代替。

11、创建文件命令:touch

使用–创建一个带-a的文件

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# touch -- -a
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ls
-a

12、当删除文件时,程序正在使用,这时删除后并不会释放空间。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# > /boot/biggile

> 可以把文件清空,快速释放空间。
也可以使用>创建空文件,如果文件存在,还是把该文件清空覆盖。**>>**创建空文件,不会覆盖已存在文件,文件创建时间也不会刷新。

touch命令,创建的文件,如果文件已存在,不会覆盖,只会刷新创建时间。

13、rename批量更新文件名。

[root@iZ2ze data]# rename conf conf.bak *.conf

conf: 为替换的字符。
conf.bak: 为替换后的字符。
*.conf : 匹配的文件。

14、tree: 显示目录结构。

-d : 只显示目录。
-L level : 指定显示的层级数目。
-P pattern :只显示由指定pattern匹配到的路径。

15、创建文件夹:mkdir

-p :如果上级目录不存在,会自动创建。
-v: 显示文件夹创建过程。

16、删除空文件夹: rmdir

-p: 删除多级空目录。

17、查看文件下,空间占用情况:df

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# df
Filesystem     1K-blocks     Used Available Use% Mounted on
devtmpfs          930732        0    930732   0% /dev
tmpfs             941040        0    941040   0% /dev/shm
tmpfs             941040      616    940424   1% /run
tmpfs             941040        0    941040   0% /sys/fs/cgroup
/dev/vda1       41147472 10909004  28334976  28% /
tmpfs             188212        0    188212   0% /run/user/0

18、硬链接

概念: 对一个文件,起多个名字。指向的同一数据块。不能跨分区,可以跨目录进行操作。不支持目录的硬链接。
语法:ln filename [linkname]
案例: 对f文件,链接到f222文件。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ln f  f222

19、软链接
概念:软链接名指向的是文件名。软链接支持文件夹。支持目录和分区。
语法:ln -s filename [linkname]

案例: f2-link 文件指向f2文件。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ln -s f2 f2-link
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ll -i
total 20
1840417 drwxr-xr-x 2 root root  4096 May 26 20:55 dir
1840416 -rw-r--r-- 2 root root     0 May 26 20:45 f11
1840418 -rw-r--r-- 1 root root     0 May 26 21:00 f2
1840416 -rw-r--r-- 2 root root     0 May 26 20:45 f222
1840419 lrwxrwxrwx 1 root root     2 May 26 21:01 f2-link -> f2

20、查看文件内容类型命令:file
语法:file [options]

常用选项:
-b: 列出文件辨识结果时,不显示文件名称。
-f:filelist列出文件filelist中文件名的文件类型。
-F:使用指定分隔符号替换输出文件名后默认的“:”分隔符。
-L:查看对应软链接对应文件的文件类型。
--help: 显示命令在线帮助。

查看f2文件内容类型,此文件f2为空。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# file f2
f2: empty

文件profile,为文本文件。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# file /etc/profile
/etc/profile: ASCII text

21、重定向

将当前窗口的命令的结果,输出到另一个窗口。

语法:command > 窗口,将文件命令结果输出到另一个文件中或者窗口中。

示例: ls命令, > 输出符号,/dev/pts/2 为窗口终端号。

ls > /dev/pts/2

>> : 追加到文件末尾。

22、转换和删除字符命令:tr
语法:tr [OPTION] SET1 [SET2]

示例: 将文件/etc/issue 中的小写字符,转换为大写。

< 表示输入。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cat /etc/issue
\S
Kernel \r on an \m

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# tr 'a-z' 'A-Z' < /etc/issue
\S
KERNEL \R ON AN \M

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# tr 'a-z' 'A-Z' < /etc/issue
常用选项:
-t:将第一个字符集对应字符转化为第二个字符集对应的字符。
-d: 删除所有属于第一字符集的字符。
-c: 取字符的补集,取反。
-s:将连续的字符删除。

示例:cat 输入文件重定向,这种写法每一个回车都会输入。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cat f1
aaa
bbb
ddd

如果想连续多行再进行输入,可以执行行下面命令。EOF可以是任何字符,在输入结束时输入该字符表示结束。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cat > f1 < sss
> eee
> fff
> EOF
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cat f1
sss
eee
fff

23、多行发送给STDIN(标准输入)
使用 << 终止词 命令从键盘把多行重定向给STDIN。
直到终止词位置的所有文本都发送给STDIN。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# mail -s "lst message" root < Hello world
> how are you?
> END  // 结束符

24、管道符:|, 用来连接命令。

用法:命令1 | 命令2 | 命令3
将命令1的结果发送给命令命令2,命令2的结果发送给命令3。

案例: 把whoami的命令结果,输入到tr命令。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# whoami | tr 'a-z' 'A-Z'
ROOT

25、分页查看文件命令:less

b:向上翻一页
d:向后翻半页
回车键 滚动一行
空格键 滚动一页

26、管道中-符号
示例: 将/home目录中的文件打包,但打包的数据不是记录到文件,而是传送到stdout(标准的输出),经过管道后,将tar -cvf - /home 传送给后面的tar -xvf -,后面的这个-则是取前一个命令的stdout,因此,就不需要使用临时file了。

tar -cvf - /home  | tar -xvf -
文件查找和压缩

文件查找命令:locate 外部命令。

1、实时查找文件命令:find。通过遍历指定路径完成文件查找。
语法:find [OPTION] ... [查找路径] [查找条件] [处理动作]

查找路径: 指定具体目标路径;默认为当前目录。
查找条件:指定的查找标准,可以以文件名、大小、类型、权限等标准进行。
处理动作:对符合条件的文件做操作,默认输出至屏幕。

查找条件:
1)指搜索层级:
-maxdepth level : 最大搜索目录深度,指定目录为第一级。
-mindepth level: 最小搜索目录深度。

案例: 只查找data目录下的文件。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# find /data -maxdepth 1
/data
/data/bc.txt
/data/xzbg.tar.gz
/data/f11
/data/dir
/data/xzbg
/data/tr.log
/data/f1

2)处理目录内的文件,再处理目录。
-depth
3) 根据文件名和inode 查找

-name “文件名称”: 根据文件名查找。
-iname “文件名称” : 不区分字母大小写。
-inum n: 按inode号查找。
-samefile name :相同inode 号的文件。
-links n: 链接数为n的文件。
-regex “PATTERN” : 以pattern 匹配整个文件路径,而非文件名称

查看 当前目录下包含f的文件。* 作为通配符。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# find -name "*f*"
./f11
./f1
./f222
./f2-link
./f2

2、 压缩、解压文件命令:tar

常用选项:
-c 或 --create: 建立新的备份文件。
-f 或--file :指定备份文件。
-v或--verbose: 显示指令执行过程。
-x或--extract:从备份文件中还原文件。 

压缩:tar -cvf [压缩后的文件名] [要准备压缩的文件]
解压:tar -xvf [解压的文件名]

字符串替换命令

语法: tr [OPTIONS] [set1] [set2]
tr只能接收来自标准的输入流,不能接收参数。将字符中的set1, 替换为set2.

-s  : 将SET1中指定的连续的连续重复的字符用单个字符替代在这里插入代码片
cut命令,类比字符串截取

语法: cut [OPTIONS] [FILE]
如果不指定file参数,cut命令将读取标准输入。

-b: 以字节为单位进行分割。
-d : 自定义分隔符,
-f: 与-d一起使用,指定显示哪个区域。
sort, 排序命令。
-n 依照数值的大小排序。
-r 以相反的顺序来排序。
head读取文件头部信息。
-n,--lines=[-]K 显示前K行。如果K前有-,则表示显示除最后K行外的所有行

Shell 脚本编程

1、编程基础

程序: 指令 + 数据

程序编程风格:

  • 过程式:以指令为中心,数据服务于指令。关注过程。
  • 对象式:以数据为中心,指令服务于数据。关注结果。

shell程序: 提供了编程能力,解释执行。

计算机: 运行二进制指令。
编程语言:

  • 低级:汇编。
  • 高级: 编译:高级语言–>编译器–>目标代码;java,C++。
    解释:高级语言–>解释器–> 机器代码;shell,python,perl。

编程逻辑处理方式:
顺序执行、循环执行、选择执行。

shell编程: 过程式、解释执行。
编程语言的基本结构:
各种系统命令的组合;
数据存储:变量、数组。
表达式: a + b
语句:if

案例: 编写hello.sh,并执行。
hello.sh

echo "hello world"
echo my hostname is $(hostname)

在当前目录下,直接自行hello.sh提示命令不存在。因为我们新建的命令属于一个外部命令,而外部命令的执行过程是去PATH变量下,查找这个命令。而我们新建的hello.sh并没有添加在PAHT变量下,所以可以通过绝对路径或者相对路径的方式去执行./hello.sh

查看系统PATH变量的值

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# echo $PATH
/usr/local/jdk1.8.0_231/bin:/usr/local/node/bin:/data/mysql/bin:data/mysql/lib/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/webserver/nginx/sbin:/usr/local/rabbitmq/rabbitmq_server-3.6.15/sbin:/usr/local/erlang/bin:/root/bin

2、变量使用

自定义的脚本为了避免每次都需要写路径执行,可以将脚本文件放到$PATH变量目录下。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# echo $PATH
/usr/local/jdk1.8.0_231/bin:/usr/local/node/bin:/data/mysql/bin:data/mysql/lib/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/webserver/nginx/sbin:/usr/local/rabbitmq/rabbitmq_server-3.6.15/sbin:/usr/local/erlang/bin:/root/bin

1、shell脚本以 #!/bin/bash开头。

2**、脚本调试**

  • 检测脚本中的语法错误
bash -n /path/to/some_script
  • 调试执行
bash -x /path/to/some_script

语法错误,脚本不会继续执行后续的程序。
案例: bash -n检查语法错误。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# bash -n f.sh
f.sh: line 5: syntax error: unexpected end of file

bash -x脚本调试检测, 每个命令都有对应的结果输出。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]#  bash -x f.sh 
+ hostname
iZ2ze6xkq7xjxmfnsdw27yZ
+ ls /boot
biggile
config-3.10.0-1062.1.2.el7.x86_64
+ rm -rf /data/f.sh

3、 变量
变量名称:命名的是内存空间
变量类型:字符,整型,浮点型。
变量引用需要加 $符号。

shell脚本命令规则

  • 不能使用程序中保留字:例如if,for
  • 只能使用数字、字母及下划线,且不能以数字开头。
  • 见名知义。
  • 统一命名规则:驼峰命名法。
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# name="yueli"
[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# echo $name
yueli

4、bash变量
局部变量:生效范围为当前shell进程;只能在当前shell中使用。

全局变量:可以在当前shell进程或子线程中使用。

本地变量:生效范围为当前shell进程中某代码片断,通常指函数。

位置变量:$1,$2,… 来表示,用于让脚本在脚本代码中调用,通过命令行传递给它的参数。

特殊变量:$?, 0 , 0, 0,*, @ , @, @,#,$$

删除变量命令unset + [变量名]:在脚本中,在脚本执行完毕后,建议执行unset释放变量。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# unset name

set命令查看所有变量,函数

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# set
3、 局部变量

1、变量赋值: name=‘value’

2、可以使用引用value:

  • 可以是直接字符串; name=“root”
  • 变量引用: name=“$USER”
  • 命令引用:name=`command`` 或 name=${command}

3、变量引用: n a m e 、 {name} 、 namename

  • “”:弱引用,其中的变量引用会被替换为变量值。
  • ‘’: 强引用,启动的变量引用不会被替换为变量值,而保持原字符串。

4、显示已定义的所有变量:set

5、删除变量:unset 【变量名】

查看命令进程树:

pstree  -p
4、环境(全局)变量

变量声明、赋值:

  • export name = VALUE
  • declare -x name = VALUE

变量引用: $name, ${name}

显示所有环境变量:

env
printenv
declare -v

删除变量:

unset name
5、只读和位置变量

只读变量: 只能声明,但是不能修改和删除。

声明只读变量:生命周期只在当前进程。

readonly name
declare -r name

查看只读变量:

readonly -p 

示例:

小括号()开启子shell,不影响当前环境。大扩号{}不开启子shell, 影响当前环境。

大扩号:

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# { name=mage;echo $name; }
mage
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo $name
mage

小括号执行:只在当前子shell进程有效

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# ( name=haha; echo $name; )
haha
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo $name
mage

() 会继承外部变量的值,如果该变量又重新赋值,()小括号内的变量值会改变。而不影响外部的变量。

位置变量: 在脚本代码中调用通过命令行传递给脚本的参数。

$1,$2… : 对应第1、第2等参数。
$0 : 命令本身,命令名。
$* : 传递给脚本的所有参数,全部参数合为一个字符串。
$@: 传递给脚本的所有参数,每个参数为独立字符串。
$#: 传递给脚本的参数的个数。

示例:
参数脚本案例:
$1, 获取脚本执行第一个参数的值
$2, 获取脚本执行第二个参数的值。
$*, 获取所有的参数。
$#, 获取脚本传入的参数个数。
$0, 获取脚本的名称。不加basename命令,会是脚本的全路径。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cat test.sh 
#!/bin/bash
echo "ist arg is $1"
echo "2st arg is $2"
echo "3st arg is $3"
echo "all args is $*"
echo "all args is $@"
echo "The args number is $#"
echo "The script name is `basename $0`"

执行结果:

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# ./test.sh  xxx yyy zzz
ist arg is xxx
2st arg is yyy
3st arg is zzz
all args is xxx yyy zzz
all args is xxx yyy zzz
The args number is 3
The script name is test.sh

远程复制文件:
scp 命令,远程复制。
f1 当前服务器要传送的文件。
wang远程服务器的用户名。
172.20.102.77: 远程服务器的地址。
/home/wang/bin: 远程服务器copy文件的地址。

远程的目录需要wang用户有改权限。

scp f1 [email protected]:/home/wang/bin

每次远程复制,都需要使用该命令。现在可以把传送文件目录变为参数,写成一个脚本,减少每次执行脚本的复杂度。

远程复制脚本示例:

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# cat scp.sh 
!#/bin/bash
echo "start copy ..."
scp $1 [email protected]:/home/wang/bin
echo "copy is finished"

软链接可以通过$0 判断执行不同的功能。

6、 参数传递

位置参数左移命令: shift

比如每执行一次shift 3表示传入的参数移除三个。默认shiftshift 1

7、退出状态
  • 进程使用退出状态类报告成功或失败
  • 0成功, 1-255代表失败。
  • $? 变量保存最近的命令退出状态。

示例:比如执行一个命令后,在 执行 echo $?,输出为0,表示命令执行成功。

退出状态码:

  • bash 脚本可以自定义退出状态码。
  • exit [n]: 自定义退出状态码。

注意:1)脚本中一旦遇到exit命令,脚本会立即终止;终止状态取决于exit命令后面的数字。
2)如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码。

8、算数运算
  • bash中算数运算支持: + , - , / , %(取模,取余), ** (乘方)

在脚本运算中默认将 运算符当成字符计算,所以需要使用一下方式,进行算术运算。

  • let var = 算术表达式。
  • var = $[算术表达式]。

bash 有内建的随机数生成器:$RANDOM(0-32767)

示例: 0-49之间的随机数。

[root@iZ2ze6xkq7xjxmfnsdw27yZ data]# echo $[$RANDOM%50]
22
9、条件测试

判断某需求是否满足,需要由测试机制来实现。

专用的测试表达式需要由测试命令辅助来完成测试过程。

评估布尔声明,以便用在条件执行中。

  • 若真,则返回0.
  • 若假,则返回1.

测试命令test [expression]

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# test str1 = str2
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo $?
0

[] 可以进行算法运算,替代testlet等命令。

[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# [ str1 = str3 ]
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo $?
1

数字比较 使用 -eq参数。

[root@iZ2ze6xkq7xjxm^C
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# m=99
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# n=99
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# [ $m -eq $n ]
[root@iZ2ze6xkq7xjxmfnsdw27yZ ~]# echo $?
0

检查磁盘占用率的检查脚本案例。


#!/bin/bash
USE_RATIO=`df | grep "^/dev/vd" | tr -s " " "%" | cut -d% -f5 | sort -nr | head -1`

[ "$USE_RATIO" -ge 30 ]&& `wall "disk will be full"`

在中括号中使用变量时,建议加双引号。

小括号和花括号的区别
小括号是开启一个子shell。
花括号是在当前shell。

你可能感兴趣的:(Linux)