Shell解释器编程规范与变量

常见的编程语言分为两类:一个是编译型语言,如:c/c++/java等,它们运行前全部一起要经过编译器的编译。另一个解释型语言,执行时,需要使用解释器一行一行地转换为代码,如:awk, perl, python与shell等。
一、Shell脚本的概念
·将要执行的命令按顺序保存到一个文本文件
·给该文件可执行权限,便可运行
·可结合各种Shell控制语句以完成更复杂的操作
二、Shell脚本应用场景
·重复性操作
·批量事务处理
·自动化运维
·服务运行状态监控
·定时任务执行
三、Shell脚本的构成
1、脚本声明
2、注释信息
3、可执行语句
在这里插入图片描述
四、Shell脚本的编写与执行
1、编写Shell脚本
[root@localhost ~]# cat -n first.sh
1 #!/bin/bash
2 # Filename: first.sh
3 # Description: 列表查看内核文件详细信息
4 # Author: Mini
5 # Date: 2019-01-15
6 # Version: 1.0.0
7 cd /boot/
8 echo "当前所在路径: "
9 pwd
10 echo "内核文件: "
11 ls -l vmlinuz*
注:在脚本中ls -l 不可简写为ll

2、执行Shell脚本
(1)绝对路径
(2)相对路径
(3)sh 脚本路径(与“bash 脚本路径”相同)
(4)source 脚本路径(与“. 脚本路径”相同)
其中,绝对路径与相对路径实行shell脚本时,该脚本文件必须具有可执行权限。source脚本路径的方法,只在当前环境生效,其他三种方法是另外再开一个shell。
[root@localhost ~]# bash first.sh
当前所在路径:
/boot
内核文件:
-rwxr-xr-x. 1 root root 6224704 8月 24 08:02 vmlinuz-0-rescue-8a55e810cd8844d88d6eac98cefb9fb2
-rwxr-xr-x. 1 root root 6224704 4月 21 2018 vmlinuz-3.10.0-862.el7.x86_64

[root@localhost ~]# sh first.sh
当前所在路径:
/boot
内核文件:
-rwxr-xr-x. 1 root root 6224704 8月 24 08:02 vmlinuz-0-rescue-8a55e810cd8844d88d6eac98cefb9fb2
-rwxr-xr-x. 1 root root 6224704 4月 21 2018 vmlinuz-3.10.0-862.el7.x86_64

[root@localhost ~]# . first.sh
当前所在路径:
/boot
内核文件:
-rwxr-xr-x. 1 root root 6224704 8月 24 08:02 vmlinuz-0-rescue-8a55e810cd8844d88d6eac98cefb9fb2
-rwxr-xr-x. 1 root root 6224704 4月 21 2018 vmlinuz-3.10.0-862.el7.x86_64
[root@localhost boot]#

[root@localhost ~]# /root/first.sh
-bash: /root/first.sh: 权限不够
[root@localhost ~]# ./first.sh
-bash: ./first.sh: 权限不够
[root@localhost ~]# chmod +x first.sh
[root@localhost ~]# /root/first.sh
当前所在路径:
/boot
内核文件:
-rwxr-xr-x. 1 root root 6224704 8月 24 08:02 vmlinuz-0-rescue-8a55e810cd8844d88d6eac98cefb9fb2
-rwxr-xr-x. 1 root root 6224704 4月 21 2018 vmlinuz-3.10.0-862.el7.x86_64
[root@localhost ~]# ./first.sh
当前所在路径:
/boot
内核文件:
-rwxr-xr-x. 1 root root 6224704 8月 24 08:02 vmlinuz-0-rescue-8a55e810cd8844d88d6eac98cefb9fb2
-rwxr-xr-x. 1 root root 6224704 4月 21 2018 vmlinuz-3.10.0-862.el7.x86_64
3、Shell脚本的使用

注:CentOS 7.X /etc/rc.local文件需先给执行权限才会生效

五、管道操作
1、管道操作符号“|”
2、管道符号的作用:将左侧的命令输出结果,作为右侧命令的处理对象
3、格式:cmd1|cmd2 […|cmdn]
4、示例:
[root@localhost ~]# rpm -qa | grep “gcc”
gcc-c+±4.8.5-28.el7_5.1.x86_64
gcc-gfortran-4.8.5-28.el7_5.1.x86_64
libgcc-4.8.5-28.el7_5.1.x86_64
gcc-4.8.5-28.el7_5.1.x86_64

[root@localhost ~]# grep “/bin/bash” /etc/passwd | wc -l
1

[root@localhost ~]# ifconfig | grep “inet”
inet 192.168.8.101 netmask 255.255.255.0 broadcast 192.168.8.255
inet6 fe80::20c:29ff:fef8:59a0 prefixlen 64 scopeid 0x20
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
六、重定向操作
1、标准输入、标准输出与标准错误
(1)标准输入(standard input):从该设备接受用户输入的数据
(2)标准输出(standard output):通过该设备向用户输出数据
(3)标准错误(standard error):通过该设备报告执行出错信息
类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器
2、重定向操作分类
类型 操作符 用途
重定向输入 < 从指定的文件读取数据
重定向输出 > 将输出结果保存到指定文件
>> 将输出结果追加到指定文件
标准错误输出 2> 将错误信息保存到指定文件
2>> 将错误信息追加到指定文件
混合输出 &> 将标准输出、标准错误输出保存到同一文件
示例:
重定向输入:
请先关闭selinux
[root@localhost ~]# useradd Mini
[root@localhost ~]# cat mima.txt
123123
123123
[root@localhost ~]# passwd Mini < mima.txt
更改用户 Mini 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。

[root@localhost ~]# echo “0 8 * * * /root/a.sh” >> cron.txt
[root@localhost ~]# crontab < cron.txt
[root@localhost ~]# crontab -l
0 8 * * * /root/a.sh

覆盖重定向:
[root@localhost ~]# echo “aaa” > 1.txt
[root@localhost ~]# echo “bbb” > 1.txt
[root@localhost ~]# cat 1.txt
bbb

追加重定向:
[root@localhost ~]# echo “aaa” > 1.txt
[root@localhost ~]# echo “bbb” >> 1.txt
[root@localhost ~]# cat 1.txt
aaa
bbb

标准错误输出重定向:(覆盖重定向及追加重定向)
[root@localhost ~]# LS 2> 1.txt
[root@localhost ~]# cat 1.txt
-bash: LS: 未找到命令
[root@localhost ~]# LS 2>> 1.txt
[root@localhost ~]# cat 1.txt
-bash: LS: 未找到命令
-bash: LS: 未找到命令

混合输出:
[root@localhost ~]# cat test.sh
#!/bin/bash
LS
ls
[root@localhost ~]# sh test.sh &> 3.txt
[root@localhost ~]# cat 3.txt
test.sh:行2: LS: 未找到命令
1.txt
3.txt
anaconda-ks.cfg
test.sh

七、变量
1、变量的概念
变量(variable)用来存放系统或用户需要使用的特定参数或者值,变量的值可以根据用户设定或者系统环境变化而相应变化,在Shell脚本中使用变量,可使脚本更加灵活,适应性更强。
与其他编程语言不同,Bash中的变量没有数据类型的区别,变量中的值都是以字符串的形式保存的,如果要进行数值计算,需要进行特殊转换

2、变量的分类
(1)自定义变量:由用户自己定义、修改和使用
[root@localhost ~]# NAME=“Mini” //创建
[root@localhost ~]# echo $NAME //变量的输出
Mini
[root@localhost ~]# NAME=“tom” //修改
[root@localhost ~]# echo $NAME
tom
[root@localhost ~]# unset NAME //删除
[root@localhost ~]# echo $NAME

变量名定义规范:
1、变量名要以[a-z]、[A-Z]、开头,不能以数字开头,但可以包含数字;
2、不要用系统命令、关键字命名变量;
3、定义变量名时应“见名知意”;
4、变量名过长时,建议使用“
”进行分隔,或使用“驼峰命名法”。
(2)环境变量:由系统维护,用于设置工作环境
[root@localhost ~]# env
XDG_SESSION_ID=1
HOSTNAME=localhost
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.8.1 60352 22
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=zh_CN.UTF-8
……
其中PATH变量用于设置可执行程序的默认搜索路径
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@localhost ~]# PATH=$PATH:/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost ~]# first.sh
当前所在路径:
/boot
内核文件:
-rwxr-xr-x. 1 root root 6224704 8月 24 08:02 vmlinuz-0-rescue-8a55e810cd8844d88d6eac98cefb9fb2
-rwxr-xr-x. 1 root root 6224704 4月 21 2018 vmlinuz-3.10.0-862.el7.x86_64

此时PATH环境变量被临时修改。
可以修改全局变量文件/etc/profile 或修改某用户家目录下的~/.bash_profile文件永久改变环境变量。

[root@localhost ~]# echo ‘PATH=$PATH:/root’ >> /etc/profile
[root@localhost ~]# . /etc/profile

(3)位置变量:通过命令行给脚本程序传递参数(也属于预定义变量)
为了在使用Shell脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念
位置变量有$0,$n 
$0:第一个字段表示命令名或脚本名称
$1:脚本要处理的第一个参数
$2:脚本要处理的第二个参数
	……
Shell脚本最多可以直接处理9个参数

[root@localhost ~]# cat test.sh
#!/bin/bash

echo $1
echo $2
echo $3
[root@localhost ~]# sh test.sh 11 22 33
11
22
33

如果有10个参数怎么办呢?
[root@localhost ~]# cat test.sh
#!/bin/bash

echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10}
[root@localhost ~]# sh test.sh 11 22 33 44 55 66 77 88 99 aa
11
22
33
44
55
66
77
88
99
aa

(4)预定义变量:Bash中内置的一类变量,不能直接修改
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$*、$@		保存了脚本要处理的所有参数($*把所有参数视为整体,$@单个参数的					组合)
	$0			保存了脚本的名称
$?			保存着命令或脚本执行状态码
$#			保存了脚本要处理的参数的个数
$$			当前进程给脚本的PID号(用的相对较少)
$!			后台运行的最后一个进程的PID号(用的相对较少)

[root@localhost ~]# cat backup.sh
#!/bin/bash

将要备份的文件或目录传递给位置变量

tar czf backup_$(date +%Y%m%d).tgz $* &> /dev/null
echo “已执行脚本 $0,”
echo “共完成 $# 个文件的备份,”
echo “具体包括: $@”
[root@localhost ~]# sh backup.sh /etc/passwd /etc/shadow /etc/group
已执行脚本 backup.sh,
共完成 3 个文件的备份,
具体包括: /etc/passwd /etc/shadow /etc/group
[root@localhost ~]# echo $? //上一条的脚本运行是否成功,成功为0,不成功非0
0
[root@localhost ~]# ls backup_20190116.tgz
backup_20190116.tgz

3、变量定义与输出
(1)定义一个新的变量
格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写
(2)赋值可使用引号
·双引号:允许通过 符 号 引 用 其 他 变 量 值 ( 弱 引 用 ) ⋅ 单 引 号 : 禁 止 引 用 其 他 变 量 值 , 符号引用其他变量值(弱引用) ·单引号:禁止引用其他变量值, 视为普通字符(强引用)
·反撇号:``或$() 命令替换,提取命令的执行结果

(3)输入输出
	·输入格式:read [-p “提示信息”] 变量名
	·输出格式:echo $变量名

[root@localhost ~]# cat readDemo.sh
#!/bin/bash

read -p "Username: " NAME
read -p "Password: " PASSWORD
if [ $NAME == “Mini” ] && [ $PASSWORD == “123123” ];then
echo “Welcome $NAME !!!”
else
echo “Incorrect user name or password.”
fi
[root@localhost ~]# sh readDemo.sh
Username: Mini
Password: 123123
Welcome Mini !!!

printf输出
没有echo自带的换行符,需要自己写\n
支持字符串格式化(%s用于字符串, %d用于十进制数)
[root@localhost ~]# printf “My name is %s. I’m %d years old.\n” Mini 18
My name is Mini. I’m 18 years old.

4、变量作用范围(变量的作用域)
默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell时,局部变量将无法再使用。为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”
格式1:export 变量名
格式2:export 变量名=变量值
两种格式可以混合使用

[root@localhost ~]# export NAME=“Mini”
[root@localhost ~]# AGE=18
[root@localhost ~]# bash //开启一个新的子shell
[root@localhost ~]# echo $NAME
Mini
[root@localhost ~]# echo $AGE

[root@localhost ~]# X=1
[root@localhost ~]# export X Y=2

5、变量的算数运算
变量的数值运算多用于脚本程序的过程控制,只能进行简单的整数运算,不支持小数运算,整数值的运算主要通过内部命令expr进行。
(1)expr
格式:expr 变量1 运算符 变量2 [运算符 变量3]……
运算符号及示例:
[root@shell ~]# X=111
[root@shell ~]# Y=123
+(加):[root@shell ~]# expr $X + $Y
-(减):[root@shell ~]# expr $X - $Y
*(乘):[root@shell ~]# expr $X * $Y
/(除):[root@shell ~]# expr $X / $Y
%(取余|取模):[root@shell ~]# expr $X % $Y

[root@localhost ~]# expr 6 / 4
1
[root@localhost ~]# expr 6 % 4
2
[root@localhost ~]# expr 6 * 4
24
[root@localhost ~]# expr 6 ** 4 //expr不支持幂运算
expr: 语法错误

(2)echo $(())
[root@localhost ~]# echo $((6/4))
1
[root@localhost ~]# echo $((6%4))
2
[root@localhost ~]# echo $((6*4))
24
[root@localhost ~]# echo $((6**2))
36

(3)echo $[]
[root@localhost ~]# echo $[6/4]
1
[root@localhost ~]# echo $[6%4]
2
[root@localhost ~]# echo $[6*4]
24
[root@localhost ~]# echo $[6**2]
36

求精度计算:
[root@localhost ~]# yum -y install bc

[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
scale=3 //指定计算精度,保留小数点后3位
10/3
3.333
6/4
1.500

[root@localhost ~]# echo “scale=3; 10/3” | bc
3.333

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mini_Xiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值