shell----基础篇

shell--基础

shell分类

Shell类型 易学性 可移至性 编辑性 快捷性
Bourne shell(sh) 容易 较差 较差
Bourne Againshell(bash) 较好
C shell(csh) 较难 较好 较好
TC shell(tcsh)

查询Linux中支持的shell类型:

$ cat /etc/shells 

Shell脚本的执行方式

echo 命令

echo  [选项]  [输出内容]
	-e	支持反斜线控制的字符转换
	-n	取消输出后行尾的换行符号

-e选项 支持的特殊符号列表


style="zoom:150%;" />

echo 显示颜色

格式:“\e[m”代表颜色输入开始;“\e[m” 代表颜色输入结束
文字颜色:
	30=黑色,31=红色,32=绿色,33=黄色,34=蓝色,35=紫色,36=天蓝,37=白色,39=结束
底纹颜色:
	40=黑色,41=红色,42=绿色,43=黄色,44=蓝色,45=紫色,46=天蓝,47=白色,49=结束
特殊的显示:
	\e[0m 关闭所有属性 
	\e[1m 设置高亮度 
	\e[4m 下划线 
	\e[5m 闪烁
	\e[7m 反显 
	\e[8m 消隐
注意:多个条件之间用分号(;)分割开,同时生效。

创建一个合格的shell脚本

# vim hello.sh
#!/bin/bash                 # 解析器类型
#This is my first piece of code							描述信息
#Author(Email):liuchuan_jy@163.com					作者联系人:可不写
echo "We will print hello world of 7 colors."
echo -e "\e[30;1mhello world\e[0m"
echo -e "\e[31;1mhello world\e[0m"
echo -e "\e[32;1mhello world\e[0m"
echo -e "\e[33;1mhello world\e[0m"
echo -e "\e[34;1mhello world\e[0m"
echo -e "\e[35;1mhello world\e[0m"
echo -e "\e[36;1mhello world\e[0m"

执行shell脚本

1)添加执行权限(相对或绝对路径执行)
	$ chmod +x hello.sh 
	$ ./hello.sh 
2)用bash命令,调用脚本文件(不需要执行x权限)
	$ bash hello.sh 

Bash 的基本功能

历史命令的查看

命令:history  [选项]
	-c	清空历史命令
	-w	把缓存中的历史命令保存到历史命令配置文件

历史命令的调用

调用之前使用过的历史命令有以下几种办法:
	使用上、下光标键调用
	使用“!n”,重复执行第n条历史命令
	使用“!!”,重复执行上一条命令
	使用“!字符”,重复执行最近一条以此字符开头的命令

命令与文件名的补全

使用tab按钮,提供了如命令补齐、路径补齐等功能

命令别名

命令:alias 别名=’原命令 [选项]’
# 查看已经生效的命令
	$ ailas

别名相关配置文件(永久保存别名)

单个用户生效:~/.bashrc
所有用户生效:/etc/bashrc
注:别名命令的优先级更高,如:执行ls,优先执行的ls的别名
$ source   配置文件

不同类型的命令执行的顺序:

用绝对路径或相对的方式执行命令
别名命令
bash 内置命令
根据环境变量定义的目录查询找到的命令

Bash 常用快捷键


style="zoom:150%;" />

bash的标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准正确输出
显示器 /dev/stderr 2 标准错误输出

bash的输出重定向

统计命令

命令:wc  [选项]  [文件名]
	-c	统计字数(字符)
	-w	统计单词数(字符串)
	-l	统计行数

多命令顺序执行

grep 命令

命令:grep  [选项] “关键词” 文件名 		#行提取命令
		-A 数字:列出符合条件的行,并将连续列出后续n行
		-B 数字:列出符合条件的行,并将连续列出前面n行
		-c	:统计包含字符串的行一共几行!
		-i	:忽略大小写
		-n	:输出行号
		-v	:反向查找(取反)
		--color=auto:搜索出的关键词高亮显示(默认别名)

通配符

image-20210313152621786

管道符

格式:命令1 | 命令2	#将命令1的标准输出作为命令2的标准输入
例:ls  -l  /etc  | more # 分页显示/etc内容
格式:命令 |xargs 命令2 # 将命令1的标准输出当做命令2的执行参数(执行对象),默认逐个处理
例:find /etc -name *.txt | xargs cat  # 在/e![image-20210313152914747](D:\学习笔记\makedown\mk笔记\shell\图片文件\shell-基础.assets\image-20210313152914747.png)tc下查找*。txt文件,并一个一个的交给cat查看

Bash 中其他特殊符号

反引号 & $() 将某命令的结果调用出来

例:
[root@localhost ~]# echo `date`
2020年 05月 15日 星期一 02:52:22 CST
[root@localhost ~]# echo $(date)
2020年 05月 15日 星期一 02:52:12 CST

小括号、大括号

# 两者区别:
	()执行一串命令时,需要重新开一个子shell进行执行
	{}执行一串命令时,是在当前shell执行
	()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开
	()最后一个命令可以不用分号结尾
	{}最后一个命令要用分号结尾
	{}的第一个命令和左括号之间必须要有一个空格
	()里的各命令不必和括号有空格

Bash的变量和运算符

定义变量

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格。
2)在Bash中,变量的默认类型都是字符串型,若要进行数值运算,必须修改变量类型为数值型。
	[root@localhost ~]# x=6
	[root@localhost ~]# y=8
	[root@localhost ~]# s=$x+$y
	[root@localhost ~]# echo $s
	6+8
3)在进行变量赋值时,等号左右两侧不能有空格。
4)变量的值如果有空格,需要使用单引号或双引号包括。其中双引号内的符号“$”、“\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。
5)双引号“ ”内的 $  \  `` 都仍然具有特殊含
6)注意:单引号中任何字符都是普通字符,不具备任何特殊含义

变量叠加

如果需要增加变量的值,那么可以进行变量值的叠加。
格式:变量名= "$变量名 新增值"  或  变量名= "${变量名} 新增值"
注意:因为是在原变量值的基础增加内容,多数会用到空格,那么必须用双引号才可以
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。

变量的分类

1)自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。
2)环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。
3)位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
4)预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

自定义变量

1) # 变量调用
	echo	 $变量名
2) # 变量查看
	set  [选项]		#开启针对变量的某些特定功能
		-u	:调用没有声明的变量时会报错
		-x	:命令执行前,会先把命令输出一次
3) # 变量删除
	unset 变量名

环境变量

1) # 环境变量设置
	export	AGE=18
	# export 声明的是环境变量
2) # 环境变量查询和删除
	env命令和set命令的区别:
		set命令查看所有变量,
		env命令只能查看环境变量。
3) # 系统默认的环境变量(PATH、PS1、LANG)
	PATH变量:系统命令存放路径
	echo $PATH
	PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个命令时,命令没有设置别名,并且也没有写命令的相对或绝对路径时,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。
# 让脚本像执行命令一样简单
方法一:可以考虑把自己写的脚本放入PATH对应的目录内
or
方法二:修改PATH变量的值,将我们存放脚本的目录叠加到PATH变量中

PS1变量:命令提示符设置

PS1是用来定义命令行的提示符的,可以按照我们自己的需求来定义提示符。
可用选项:
	\d:显示日期,格式为“星期月日”
	\H:显示完整的主机名。如默认主机名					“localhost.localdomain” 
	\h:显示简写主机名。如默认主机名“localhost” 
	\t:显示24小时制时间,格式为“HH:MM:SS” 
	\T:显示12小时制时间,格式为“HH:MM:SS” 
	\A:显示24小时制时间,格式为“HH:MM” 
	\@:显示12小时制时间,格式为“HH:MM am/pm” 
	\u:显示当前用户名
	\v:显示Bash的版本信息
	\w:显示当前所在目录的完整名称
	\W:显示当前所在目录的最后一个目录
	\#:执行的第几个命令
	\$:提示符。如果是root提示符为“#”,如果是普通用户提示符为“$” 

LANG变量:系统语系变量

Linux安装时,选择的是中文安装,所以默认的主语系变量是“zh_CN.UTF-8”
# 查询语言环境变量
	$ echo $LANG
	$ localectl status
# 查询linux中支持的语言
	$ localectl list-locales | tail -5
	$ localectl list-locales | wc -l
# 永久修改操作系统语言环境
	 $ cat /etc/locale.conf
    $ localectl set-locale LANG=en_US.utf8

$N位置参数变量:通过位置进行变量赋值和取值

预定义变量

$$:当前进程的PID(即显示当前登录shell的进程号
	echo $$
$!:最后一个放入后台执行的命令的进程
	echo $!
$?:命令执行成功:返回值为0;命令执行失败:返回值为非0
	echo $?

read接收键盘输入,完成交互式操作

read  [选项]   [变量名]
	-p	“提示信息”:在read等待时输入的信息
	-t	秒数	:read等待的秒数
	-n	字符数:read最多能接收的字符数(达标即执行)
	-s	:隐藏输入信息
# read变量名定义:
	变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY 
	如果只提供了一个变量名,则整个输入全部赋予该变量
	如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值

Shell 的运算符

数值运算的方法:使用declare声明变量类型
命令:declare	[+/-] [选项]  变量
	-   : 给变量设定类型
	+	: 取消变量的类型
	-a	: 将变量声明成数组型
	-i	: 将变量声明成整数型
	-r	: 将变量声明成只读(变量值不能修改,也不能删除,更不能取消只读选项)
	-x	: 将变量声明成环境变量
	-p	: 显示指定变量的类型及内容

数组型

	数组,计算机中可以理解是多个相同类型的元素组成的集合,用于解决复杂的数据统计和计算,我们在shell中虽然不会涉及到太多的复杂的计算,但是掌握数组有利于我们编写脚本。
	数组的名字即变量的名字,我们在变量名后面加上下标编号来区分变量中的每一个值,因此数组变量又称下标变量。
	注:数组的下标从0开始,调用数组的元素时要使用${数组[下标]}的格式
例:
	a[0]=1
	a[1]=2
	a[2]=3
	echo $a ===>1
   echo "${a[@]}" ===>1 2 3 
   echo "${a[2]}" ===>3

整数型

[root@localhost sh]# declare -i a=100
[root@localhost sh]# declare -i b=200
[root@localhost sh]# declare -i s=$a+$b
[root@localhost sh]# echo $s
300

环境变量

用declare 将变量声明成环境变量,和export是同样的效果。
declare -x 变量名=值,声明后使用env查看一下。
[root@localhost sh]# declare -x XBZ="www wyy"
[root@localhost sh]# env | grep XBZ
					 XBZ=www wyy

只读变量

只要对变量设置了只读属性,这个变量只能进行调用,不能进行修改和删除,甚至不能进行取消只读选项。
[root@localhost sh]# declare -r test=100w
[root@localhost sh]# 
[root@localhost sh]# echo $test
100w
[root@localhost sh]# test=200w
-bash: test: 只读变量
[root@localhost sh]# unset test
-bash: unset: test: 无法反设定: 只读 variable
[root@localhost sh]# 
[root@localhost sh]# declare +r test
-bash: declare: test: 只读变量

查询变量

$ declare -p XBZ

使用expr 或 let 进行数值运算

这两个是直接声明运算过程是数值运算,而不是通过声明变量的类型
expr 使用时需要注意的是,在运算符两边要有空格,否则不会正常运算。
[root@localhost sh]# x=1000
[root@localhost sh]# y=2000
[root@localhost sh]# expr $x + $y
3000
let 能进行自增增减,或者指定增加量或减少量。
root@localhost sh]# x=1000
[root@localhost sh]# y=2000
[root@localhost sh]# let s=$x+$y
[root@localhost sh]# echo $s
3000

# 自增&自减
[root@localhost sh]# n=1
[root@localhost sh]# let n++
[root@localhost sh]# echo $n
2
[root@localhost sh]# let n++
[root@localhost sh]# echo $n
3
[root@localhost sh]# let n--
[root@localhost sh]# echo $n
2
[root@localhost sh]# let n--
[root@localhost sh]# echo $n
1
# 指定增减量
[root@localhost sh]# n=1
[root@localhost sh]# let n+=5
[root@localhost sh]# echo $n
6
[root@localhost sh]# let n+=5
[root@localhost sh]# echo $n
11
[root@localhost sh]# let n-=3
[root@localhost sh]# echo $n
8
[root@localhost sh]# let n-=3
[root@localhost sh]# echo $n
5

使用“$((运算式))或$[运算式]”格式进行运算

[root@localhost sh]# xx=100
[root@localhost sh]# yy=200
[root@localhost sh]# 
[root@localhost sh]# echo $(($xx+$yy))
300
[root@localhost sh]# echo $[$xx+$yy]
300

shell 常用运算符

优先级 运算符 功能描述
1 + - 正、负
2 * / % 乘、除、取余
3 + - 加、减
4 += -= … 自增、自减 …

环境变量的配置

source命令

# 刷新修改过的配置文件使其生效
# 登录系统时生效的环境变量配置文件
	/etc/profile
	~/.bash_profile
	~/.bashrc
	/etc/bashrc

文件的调用顺序

先调用/etc/profile文件在这个环境变量配置文件中会定义这些默认环境变量

1)USER变量:根据登录的用户,给这个变量赋值(就是让USER变量的值保存当前用户名)。
2)LOGNAME变量:根据USER变量的值,给这个变量赋值。
3)MAIL变量:根据登录的用户,定义用户的邮箱为/var/spool/mail/用户名。
4)PATH变量:根据登录用户的身份,决定PATH变量是否包含专属目录(/root/sh)。
5)HOSTNAME变量:更改主机名,给这个变量赋值。
6)HISTSIZE变量:定义历史命令的保存条数。

~/.bash_profile实现了两个功能

1)调用了~/.bashrc文件。
2)在PATH变量后面加入了“:$HOME/bin”这个目录。那也就是说,如果我们在自己的家目录中建立bin目录,然后把自己的脚本放入“~/bin”目录,就可以直接执行脚本,而不用通过目录执行了

~/.bashrc文件中主要实现了

1)定义默认别名,所以我们把自己定义的别名也放入了这个文件。
2)调用/etc/bashrc

在/etc/bashrc文件中主要定义了这些内容

1)PS1变量:也就是用户的提示符,如果我们想要永久修改提示符,就要在这个文件中修改
2)umask:定义umask默认权限。这个文件中定义的umask是针对“没有登录过程(也就是不需要输入用户名和密码时,比如从一个终端切换到另一个终端,或进入子Shell)”时生效的。如果是“有用户登录过程”,则是/etc/profile文件中的umask生效。
3)PATH变量:会给PATH变量追加值,当然也是在“没有登录过程”时才生效。
4)调用/etc/profile.d/*.sh文件

注销专用环境变量配置文件

在用户退出登录时,只会调用一个环境变量配置文件,就是"~/.bash_logout"。这个文件默认没有写入任何内容,可是如果我们希望再退出登录时执行一些操作,比如清除历史命令,备份某些数据,就可以把命令写入这个文件。

shell登录信息

/etc/issue

我们在登录tty1-tty6这六个本地终端时,会有几行的提示信息。这些提示信息是保存在哪里的?可以修改吗?当然可以修改,这些提示信息是保存在/etc/issue文件中,我们查看下这个文件:
[root@localhost ~]# cat /etc/issue
\S
Kernel \r on an \m

[root@localhost ~]#
查询组合作用可用man agetty
\d	:显示当前系统日期
\s	:显示操作系统名称
\l	:显示登录的终端号
\m	:显示硬件体系结构
\n	:显示主机名
\o	:显示域名
\r	:显示内核版本
\t	:显示当前系统时间
\u	:显示当前登录用户的序列号

/etc/motd

/etc/motd文件中是显示欢迎信息的,这个文件是在用户输入用户名和密码,正确登录之后显示欢迎信息。在/etc/motd文件中的欢迎信息,不论是本地登录,还是远程登录都可以显示。我们一般在这个文件里写一写登录警告信息,告诉用户登录后需要注意哪些事情
posted @ 2020-04-13 16:28  候你已久  阅读(100)  评论(0)    收藏  举报