一、Shell
1.1 什么是Shell
Shell
是一个命令解释器
,它在操作系统的最外层
,负责直接与用户进行交付,把用户的输入解释给操作系统,并处理各种操作系统的输出结果,最后将结果输出到屏幕反馈给用户。
我们的语言计算机是无法识别的,机器使用的是二进制语言(例如010110),这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的语言,并将计算机生成的结果返回。这个时候就出现了编程语言。
1.2 编程语言
1.2.1 低级语言
机器语言: 就是二进制语言
汇编语言: 符号语言,使用助记符来代替操作码,也就是用符号代替机器语言的二进制码
1.2.2 高级语言
编程语言:
是一种接近人类的语言,实现人们能够用容易理解的方式,进行编写程序
分为两种编程语言:
编译型语言
如:c 、 c++ 、 go、java
解释型语言
如: php、shell 、python、perl
1.2.3 编译器
编译器就是将高级语言翻译为低级语言的程序。
例如:gcc、pycharm、deveco
1.3 什么是Shell脚本?
在一个文件中,将系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,然后通过这个文件去执行时,我们就说这个程序为shell脚本或shell程序。也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,
二、shell基础
2.1 shell文件的格式
1、使用#!/bin/bash
开头
告诉脚本文件使用的哪种命令解释器。如果不指定shell,以当前shell作为执行的shell。
2、在shell中以#
号开头的,整行变为注释。执行时被忽略
3、shell程序的文件后缀为.sh
4、运行shell脚本,需要执行权限x
,可以用chmod +x
来指定
例如:
vim test.sh # .sh后缀
#!/bin/bash
# this is a shell file # 注释不显示
echo "hello,world!" #echo输出值
chmod +x test.sh #赋予shell文件执行的权限
2.2 创建shell脚本
1、创建shell文件,为.sh
后缀的文件
2、进入文件编辑,检测语法错误
3、修改文件的权限,使其可以执行,可以使用命令chmod +x file_name.sh
4、使用命令执行./fie_name.sh
2.3 shell执行方式
1、直接输入绝对路径
或 ./file_name.sh
(当前路径下执行脚本得有执行权限)
2、source file_name.sh
(可以无执行权限)
3、bash file_name.sh
或 sh file_name.sh
(不添加执行权限可以运行,bash开启新的会话)
4、sh < file_name.sh
或 cat test.sh | sh/bash
三、 shell变量
变量是shell传递数据的一种方式,变量是用来代表每个值的标识符。
3.1 变量的设置使用规则
1、 变量名数字
、字母(大小写)
和下划线_
组成。
变量名区分大小写
;变量名不能以数字开头
。
2、定义变量时=
两边不能有空格
var1=123
3、 变量的数据类型为整数型
和字符型
。
4、 如果配置变量为字符型
,建议用引号将其括起来
。如果变量值中存在空格
,需要使用单引号''
或双引号""
才能实现。
var1="test"
5、 调用变量
,在变量名前面加美元符号$
echo ${var1}
echo -n $var #-n指定为不换行显示
6、实现嵌套变量
var2=$(tar -cvf test.tar $(find / -name *.cnf))
7、变量值叠加
var3=123
echo ${var3}456.txt
3.2 变量的分类
1、自定义变量
用户自己定义的变量,在单个脚本里生效,或者用于多个脚本上。
2、环境变量
定义在用户家目录下
的.bashrc
或.bash_profile
文件中,用户私有变量,只能本用户使用。当前进程有效,并且能够被子进程调用。
3、全局变量
使用export命令
将本地变量输出为当前shell中的环境变量,全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。
4、系统变量
shell本身已经固定好了它的名字和作用,可以理解为shell命令
3.3 定义变量
实验环境为centos7
语法: 变量=值
测试:
# 定义变量,显示变量
var1=123
echo $var1
# 输出变量加括号
echo ${var1}.txt
# 测试嵌套变量
var2=$(tar -cvf test.tar $(find /root -name *.cnf))
3.4 变量符号
/
转义符
跟在\
之后的特殊符号将失去特殊含义,变为普通字符
。如\$
将输出$符号
,而不当做是变量引用
''
单引号
在单引号中所有的字符包括特殊字符($,'',和\)
都将解释成字符本身
而成为普通字符。
""
双引号
在双引号中,除了($, '', 和\ )
以外所有的字符都解释成字符本身,拥有调用变量的值
、引用命令
和转义符的特殊含义
单引号里的内容会原封不动赋值给变量,双引号里的内容如有特殊符号会保留它的特殊含义
3.5 取消变量
unset 变量名
centos7环境下:
[root@localhost ~]# var1=123
[root@localhost ~]# echo $var1
123
[root@localhost ~]# unset var1
[root@localhost ~]# echo $var1
[root@localhost ~]#
3.6 环境变量
环境变量分为两类:全局变量和局部变量
3.6.1 全局变量
全局变量对所有账号和所有的会话都是可见、可用的
【查看全局变量】
[root@localhost ~]# env
XDG_SESSION_ID=1
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.1.1.222 1271 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=10.1.1.222 1271 10.1.1.1 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
#路径里面也有PATH
[root@localhost ~]# env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
【export】
# 使用export将局部变量变成全局变量
var1=123
vim 2.sh
#!/bin/bash
echo $var1
# 赋值
export var1=123
#再次执行就引用全局变量了
bash 2.sh
【export在新开的会话没有生效,因为没有永久生效,需要写到配置文件里】
登录系统,一定会加载这4个配置文件
/etc/profile #系统全局环境和系统登录的一些配置,高亮显示、umask、history数量
/etc/bashrc #bash 全局自义配置文件,用于自定义shell
/root/.bashrc #用于单独自定义某个用户的bash
/root/.bash_profile #用户单独自定义某个用户的系统环境
# 黑客的恶意代码可能会写在这些文件中
【这些文件都是开机自启动的,如何测试配置文件的加载顺序】
可以在文件里写个echo,启动时就会显示顺序
【有多个一样的变量,是以哪个值为准】
以最后一个为准
3.6.2 局部变量
局部变量只在自己的进程当中使用,对当前的用户生效。
# 创建一个shell脚本
vim 1.sh
#!/bin/bash
var1=123
echo $var1
#运行脚本程序可以调用变量
bash 1.sh
3.6.3 PATH环境变量
Lshell要执行某一个程序,需要在系统中去搜索这个程序的路径才能使用。path变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个path路径内,就可以在全局调用这个第三方程序。
例如:
# 创建个脚本
[root@localhost ~]# vim backup
#!/bin/bash
echo "This is backup!"
# 添加权限运行
[root@localhost ~]# chmod +x back.sh
[root@localhost ~]# ./backup
This is backup!
【要让其在群居都能运行被调用】
# 查看PATH
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 配置PATH
[root@localhost ~]# PATH=/root/:$PATH
[root@localhost ~]# echo $PATH
/root/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# cd /opt
[root@localhost opt]# ll
total 0
[root@localhost opt]# backup
This is backup!
【写入/etc/profile文件】
vim /etc/profile
echo PATH=/root/:$PATH
#然后使用source重新加载
source /etc/profile
【/bin和/sbin的区别说明】
/sbin 目录下存放系统命令,如shutdown,reboot,用于启动系统,修复系统等,一般只有管理员才可以运行
/bin 目录下存放基本命令,如ls,chmod等,在Linux系统里的配置文件、脚本里常用。管理员和普通用户都可以使用
3.6.4 位置变量
Shell解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。
$0
获取当前执行的shell脚本的文件文件名,包括脚本路径,命令本身
$n
获取当前脚本的第n个参数 n=1,2…n 当n大于9时 用${10}表示。
例如:
[root@localhost ~]# vim test_2.sh
#!/bin/bash
a="A"
b="B"
echo "$a"
echo "$b"
echo $0
[root@localhost ~]# ./test_2.sh
A
B
./test_2.sh
3.6.5 特殊变量
$*
以一个单字符串显示所有向脚本传递的参数;
如"$*"用
【"】括起来的情况、以【$1 $2 … $n】的形式输出所有参数
$#
传递到脚本的参数个数
$$
当前进程的进程号PID
$?
显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误
$!
后台运行的最后一个进程的进程号pid
3.6.6 只读变量
只能声明,但不能修改和删除—有效期:当前进程有效期,退出就没有了
语法
readonly value_name
-p 查看全局只读变量
3.7 声明变量类型
语法
declare [+/-][rxi][变量名称=设置值] 或 declare -f
参数说明:
+/-
"-“可用来指定变量的属性,”+"则是取消变量所设的属性。
-f
仅显示函数。
-r
将变量设置为只读,没加变量值是查看全局只读变量
x
指定的变量会成为环境变量,可供shell以外的程序来使用。
i
[设置值]可以是数值,字符串或运算式。
四、数学运算符
4.1 expr 命令
对数字的基本计算,做比较时,输出结果假为0,1为真;特殊符号用转义符\
。
注意:比较两边要用空格隔开
例如:
【运算】
# 小于
[root@localhost ~]# expr 1 \< 3
1
# 大于
[root@localhost ~]# expr 1 \> 3
0
# 乘法
[root@localhost ~]# expr 1 \* 3
3
# 加法
[root@localhost ~]# expr 1 \+ 3
4
# 除法
[root@localhost ~]# expr 9 \/ 3
3
# 取余数
[root@localhost ~]# expr 10 \% 3
1
# 计算位数
[root@localhost ~]# expr length "hello word"
10
# 取第3-6位的字符
[root@localhost ~]# expr substr "hello word" 3 6
llo wo
4.2 常用运算表
运算符 | 意义 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 求余数 |
>或>= | 大于;大于等于 |
<或<= | 小于;小于等于 |
++ 或 - - | 递增或递减,可前置也可以后置 |
== 或 != | 用于比较两个数字是否相等或不相等,正确返回 true或1,反之返回false或0 |
&&或符号|| | 逻辑与;逻辑或 |
& | 放在命令后面为后台执行 |
^ | 行首 |
$ | 调用、行尾 |
* | 所有 |
# | 注释 |
eq(equal) | 等于 |
ge(greater equal) | 大于或等于 |
gt(greater than) | 大于 |
le (less equal) | 小于或等于 |
lt(less than) | 小于 |
ne(not equal) | 不等于 |
! | 非 |
; | 换行 |
>> | 追加 |
例如
[root@localhost ~]# ((a=1+2*3-2))
[root@localhost ~]# echo $a
5
[root@localhost ~]# b=$((1+2))
[root@localhost ~]# echo $b
3
# a++为先赋值再+1或减-1,++a或--a为先加1或减1,然后再进行赋值
[root@localhost ~]# echo $((a++))
5
[root@localhost ~]# echo $((++a))
7
4.3 使用(())运算,效率高
使用双引号方便多次计算
例如:
[root@localhost ~]# echo $((3+2*8/2))
11
五、read命令
5.1 read命令介绍
可以从键盘上读取输入的值,赋予变量
用法:
read value1 value2
可以赋予多个变量
-s
可以隐藏键盘上输入的值,例如ssh登陆时输入密码不会显示出来,实现隐藏密码。
-p
可以给予提示,一般和-s一起用
-t
指定输入时间,单位为秒,超过指定时间会直接退出
-n
指定输入的值的长度,达到指定数量会值的结束指定。未达到指定的数量,可以按回车键完成
-r
可以输入空格和特殊符号,例如@#¥,按回车键完成
例如:
【通过read赋予变量a、b变量值值】
[root@localhost ~]# read a b
1 12
[root@localhost ~]# echo $a $b
1 12
【获取passwd变量,隐藏输入的值,并配置提示】
[root@localhost ~]# read -p "input your password" -s passwd
input your password
[root@localhost ~]# echo $passwd
123
【指定变量ten,赋值的输入时间为10秒】
[root@localhost ~]# read -t 10 ten
[root@localhost ~]# echo $ten
【指定变量long的长度为3】
[root@localhost ~]# read -n 3 long
aaa
[root@localhost ~]# echo $long
aaa
【指定变量值有空格和特殊符号】
[root@localhost ~]# read -r null
wosf safs#@$@$#
[root@localhost ~]# echo $null
wosf safs#@$@$#
【输入值时换行和不换行】
[root@localhost ~]# echo 'input your name' ; read name
input your name
mike
[root@localhost ~]# echo $name
mike
[root@localhost ~]# echo -n 'input your name' ; read name
input your name mike
[root@localhost ~]# echo $name
mike
5.2 EOF
EOF是(END Of File)的缩写,表示自定义终止符。既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d 就代表EOF。EOF一般是结合cat能够多行文本输出显示
用法:
大小写的eof都可以
<<EOF #开始
.... #输入内容
EOF #结束
也可以用自定义的方式,例如:
<<abc #开始
....
abc #结束
六、date命令
6.1 date命令的使用
# 查看当前时间
date
# 设置时间
date –s ”20140125 09:17:00”
date +"%Y-%m/%d %H:%M:%S"
# 年月日时分秒
Y 详细年信息
y 简略年信息
M 分
m 月
H 当前的时间 单位时
S 当前的时间 单位秒
s 秒 是从1970年1月1日00:00:00到现在的系统秒数
%D 输出为 年/月/日 的格式。
6.2 时间是如何定义的
linux系统和windows系统相差8个小时,都是以bios作为参考的
windows是bios的时间,linux是以bios的时间做参考
6.3 输出使用反引号
echo `date`
echo $(date)
() #大括号可以用于调用变量,无指定为空
# 例如嵌套使用
变量=$( $())
find /root/ -name *.txt
VAR1 =$ (tar zcvf root.tar.gz $(find /root/ -name *.txt))