Shell编程规范与变量

Shell编程规范与变量

一.Shell脚本基础

1.Shell脚本的概念

  • 将要执行的命令按顺序保存到一个文本文档
  • 给该文件可执行权限
  • 可结合各种Shell控制语句可以完成更复杂的操作

2.什么是Shell脚本

  • 就是将命令按顺序一一列出,最后自动执行
  • 执行需要权限,也可以直接使用绝对路径
  • 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本

3.Shell脚本应用场景

  • 重复性操作
  • 交互性操作
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

4.Shell脚本的作用

  • 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
  • 减少手工命令的重复输入,一定程度上避免人为错误
  • 将软件或应用的安装及配置实现标准化
  • 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

5.脚本的格式

1. 脚本申明(解释器):第一行开头“
#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。
#!/bin/bash为默认的解释器,还有其他类型的解释器:#!/bin/python #!/bin/expect
3. 注释信息:以#开头的语句表示为注释信息
4. 可执行语句:比如echo命令用于输出“    ”之间的字符串
#yum脚本
vim test.sh

#!/bin/bash
mount /dev/sr0 /mnt

cd /etc/yum.repos.d/
mkdir /bak
mv *.repo ./bak

echo "
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
" >local.repo

yum clean all
yum makecache

bash test.sh

在这里插入图片描述

6.如何执行脚本

路径 需要x权限
绝对路径: /data/test.sh
相对路径: ./test.sh  test.sh
如果想补全加软连接

直接调用bash
shell程序 + 脚本名
bash  /data/test.sh

source.
source 脚本名
source /data/test.sh

bash -x 将脚本整个模拟执行
bash -n 检查语法错误
#调试脚本

linux中常见的shell

  • bash:基于gun的框架下发展的shell
  • csh:类似c语言的shell
  • tcsh:整合了csh提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

7.脚本执行逻辑及执行方式

7.1脚本执行逻辑
  1. 顺序执行:程序按从上到下顺序执行

  2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

  3. 循环执行:程序执行过程中需要重复执行多次某段语句

7.2执行方式
1.调用Shell程序直接读取
shell程序 + 脚本名
2.指定路径去执行文件(需要有执行权限)
[root@localhost ~]# chmod +x *   加权限
指定相对路径./test.sh
指定绝对路径/data/test.sh

#在别的目录下使用test.sh执行文件要建立软连接
ln -s /data/test.sh  /usr/bin
3.指定shell解释器去执行(不需要权限)
[root@localhost ~]#source tesh.sh/. tesh.sh
#source和.是一样的,不建议使用,因为不会开启新的shell,所以会影响当前环境

8.脚本错误调试

8.1命令错误

命令出错不会影响接下来的命令继续

[root@localhost ~]# vim test1.sh
#!/bin/bash  #1
cd /opt      #2
userad liwu  #3
ls           #4
[root@localhost ~]# bash test1.sh
test1.sh:行3: userad: 未找到命令
rh

#第三行的命令不会影响到第四行
8.2语法错误

会影响接下来的命令继续

[root@localhost ~]#vim test.sh
#!/bin/bash     
if[ 0 -le 1 ]
then
echo 'yes'
else
echo 'no'
fi
#if fi是固定格式,如果把fi删了,就会显示语法错误,命令就会停止
8.3逻辑错误

只能自己去筛查

#查代码的正确
bash -n 脚本名称 (不在当前目录下加绝对路径)     检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径)     逻辑错误

9.set -e

#在脚本的前面输入set -e,一旦命令出错立即停止
#例子
set -e
cd /op  #没有op这个目录,出错就不会执行下面的命令
rm -rf ./*

二.重定向与管道符

1.重定向

重定向的意思就是 ,不通过标准输出到屏幕上,输出到你指定的位置

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器
标准输入:通过输入设备(键盘 鼠标 扫描仪)将数据传给电脑
标准输出:输出正确的运算结果,输出在显示屏上
标准错误输出:不正确的都算错,输出在显示屏上
类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中
#例子
#输入重定向
[root@localhost ~]# vim passwd.txt  \\重定向输入
123321
[root@localhost ~]# setenforce 0     \\关闭selinux否则会有问题
[root@localhost ~]# passwd --stdin lisi < passwd.txt 
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。

[root@localhost ~]# ls >1
[root@localhost ~]# cat 1  #将当前所显示信息导给1
1
38_wyx_test.sh
anaconda-ks.cfg
initial-setup-ks.cfg
test1.sh
test.sh
公共
模板
视频
图片
文档
下载
音乐
桌面

[root@localhost ~]# ls xxx
ls: 无法访问xxx: 没有那个文件或目录
[root@localhost ~]# ls xxx 2> 1   #将错误信息覆盖原有的信息
[root@localhost ~]# cat 1
ls: 无法访问xxx: 没有那个文件或目录


[root@localhost ~]# ls xxx 2>> 1  #将错误输出结果追加到1的尾部
[root@localhost ~]# cat 1
ls: 无法访问xxx: 没有那个文件或目录
ls: 无法访问xxx: 没有那个文件或目录


[root@localhost ~]# ls /xxx /data &> 1   #将标准输出、标准错误的内容都导给1
[root@localhost ~]# cat 1
ls: 无法访问/xxx: 没有那个文件或目录
/data:

在这里插入图片描述
在这里插入图片描述

2.管道符

管道操作符号"l"

将左侧的命令输出结果,作为右侧命令的处理对象

[root@localhost ~]# echo 234 |grep -o 2
2

三.变量

1.变量基础

1.1 常见Shell变量的类型
自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改

系统内置变量:PATH,UID,HOSTNAME,USER

1.2 Shell变量的作用

用来存放系统和用户需要使用的特定参数(值)

变量名:使用固定的名称,由系统预设或用户定义

变量值:能够根据用户设置、系统环境的变化而变化

1.3 命名要求
  • 区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=

  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

#定义变量
name='value' 
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

变量引用:
$name
${name} ${}确定变量的范围

弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

1.赋值时使用双引号(" ")可以直接调用变量
2.赋值时使用单引号(' ')$只会被认为是字符$ 不会调用变量
3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结果和$( )用法相同
4.{}可以分隔变量值


[root@localhost ~]# product=kgc
[root@localhost ~]# echo $product
kgc
[root@localhost ~]# version=6.0
[root@localhost ~]# echo $product$version
kgc6.0
[root@localhost ~]# echo "$product$version"
kgc6.0
[root@localhost ~]# echo '$product$version'
$product$version
[root@localhost ~]# echo $product6.0
.0
[root@localhost ~]# echo ${product}6.0
kgc6.0
[root@localhost ~]# echo ${product}$version
kgc6.0
[root@localhost ~]# 
[root@localhost ~]# echo ls
ls
[root@localhost ~]# echo $(ls)
1 38_wyx_test.sh anaconda-ks.cfg initial-setup-ks.cfg test1.sh test.sh 公共 模板 视频 图片 文档 下载 音乐 桌面
[root@localhost ~]# echo `ls`
1 38_wyx_test.sh anaconda-ks.cfg initial-setup-ks.cfg test1.sh test.sh 公共 模板 视频 图片 文档 下载 音乐 桌面

变量追加值

变量名+=追加值

[root@localhost ~]# title=ceo
[root@localhost ~]# title+=:wang
[root@localhost ~]# echo $title
ceo:wang

[root@localhost ~]PATH+=/mnt
#修改环境变量
[root@localhost ~]PATH+=:/data
vim /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data"
1.4 read -p

从键盘输入的内容变成变量

#例子
[root@localhost ~]# vim test2.sh
#!/bin/bash
read -p "你今天开心吗" key
echo $key
[root@localhost ~]# bash test2.sh
你今天开心吗开心呢
开心呢

1.5 变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用

export 变量名
export 变量名=变量值

可以使用pstree 查看shell的环境
输入bash进入子shell
ctrl+D组合exit 退出子shell

#例子
[root@localhost ~]# abc=123
[root@localhost ~]# echo $abc
123
[root@localhost ~]# bash
[root@localhost ~]# echo $abc

[root@localhost ~]# exit
exit
[root@localhost ~]# echo $abc
123
[root@localhost ~]# export abc
#export  变量名      定义全局变量
[root@localhost ~]# bash
[root@localhost ~]# echo $abc
123


1.6 整数的运算

expr只能进行整数的运算

expr 变量1 运算符 变量2 [运算符 变量3]
 
运算符:
加法  +
减法 -
乘法  \ *
除法  /
取余 (取模)% :用来计算数值相除后的余数
#例1
[root@server myscripts]# expr 1 + 1
2
[root@server myscripts]# expr 1+1
1+1
[root@server myscripts]# expr 2 * 2
expr: 语法错误
[root@server myscripts]# expr 2 \* 2   //乘法*需要转义
4
[root@server myscripts]# expr 2 '*' 2  //乘法也可以用单引号表示但没太大必要因为只有一个字符
4

#expr不仅支持常量还支持变量的运算:
#例2
[root@localhost ~]# X=35 
[root@localhost ~]# Y=16 
[root@localhost ~]# expr $X + 5
40
[root@localhost ~]# expr $X + $Y 
51
[root@localhost ~]# expr $X \* $Y 
560 


#例3
sum=`expr $Y \* $Y \* $Y`
echo $sum

#例4
#!/bin/bash
#1.定义输出数字
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
#2.执行加法运算
expr $num1 + $num2
echo "求和数:$sum"


#let
[root@localhost ~]#a=1
[root@localhost ~]#b=2
[root@localhost ~]#let z=a+b
[root@localhost ~]#echo $z
3
[root@localhost ~]#let z=$[a-b]
[root@localhost ~]#echo $z
-1
[root@localhost ~]#let z=$((a-b))
[root@localhost ~]#echo $z
-1

let 支持加加减减 使用较多
[root@localhost ~]#i=1
[root@localhost ~]#let i++
[root@localhost ~]#echo $i
2
[root@localhost ~]#i=1;let i++;echo $i
2
[root@localhost ~]#i=1;let ++i;echo $i
2
[root@localhost ~]#i=100;let j=i++;echo $i $j
101 100
[root@localhost ~]#i=100;let j=++i;echo $i $j
101 101
#i++ 是先赋值给j后再加     ++i是加后再赋值
1.7 位置变量

位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

[root@localhost ~]# vim test2.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 ~]# bash test2.sh {a..z}
a
b
c
d
e
f
g
h
i
j
1.8 预定义(状态)变量
  • $*:表示所有位置参数的内容看成一个整体返回 返回所有
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称 当前脚本的名字
  • $$:当前进程id
  • $!: 后台任务最后一个id
[root@localhost ~]# vim 1.sh
#!/bin/bash
echo "$*"       将所有项当成一个值
echo "$@"        独立个体
[root@localhost ~]# bash 1.sh a b c
a b c
a b c
[root@localhost ~]# bash 1.sh {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z


[root@localhost ~]# ls
1     38_wyx_test.sh   initial-setup-ks.cfg  test2.sh  公共  视频  文档  音乐
1.sh  anaconda-ks.cfg  test1.sh              test.sh   模板  图片  下载  桌面
[root@localhost ~]# echo $?
0
[root@localhost ~]# ls xxx
ls: 无法访问xxx: 没有那个文件或目录
[root@localhost ~]# echo $?
2


[root@localhost ~]# vim 1.sh      
#!/bin/bash
echo "$*"     #将所有项当成一个值       
echo "$@"     #独立个体
echo "$#"     #后面参数的个数
[root@localhost ~]# bash 1.sh 
0
[root@localhost ~]# bash 1.sh a b c
a b c
a b c
3

[root@localhost ~]# pstree -p |grep bash
           |-sshd(1121)---sshd(3040)---bash(3044)---bash(42098)-+-grep(42249)
[root@localhost ~]# echo $$
42098

注意:$@ $* 只在被双引号包起来的时候才会有差异
将脚本1的结果 $@ 交给3 输出$1
将脚本2的结果 $* 交给3 输出$1
[root@localhost opt]# bash 1.sh 1 2 3
#!/bin/bash
echo "@结果"
./3.sh "$@" 
#文件1是调用文件3,结果是1
[root@localhost opt]# cat 2.sh 1 2 3
#!/bin/bash
echo "*结果"
./3.sh "$*" 
#文件2是调用文件3,指代所有变量 1 2 3

[root@localhost opt]# cat 3.sh 
#!/bin/bash
echo "$1"   
#文件3是打印第一个位置变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值