shell脚本基础

一、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.shsh file_name.sh (不添加执行权限可以运行,bash开启新的会话)

4、sh < file_name.shcat 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))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值