shell脚本基础

2. 变量

2.1 什么是变量?

  • 变量可以通过变量名访问,变量通常是可以变化的量

2.2 变量名称注意事项

  • 只能包含字母、数字、下划线,并且不能以数字开头
[root@localhost ~]# a_3=4
[root@localhost ~]# echo $a_3
4
[root@localhost ~]# 3_a=4
-bash: 3_a=4: 未找到命令
[root@localhost ~]# 
  • 不应该跟系统中已有的环境变量重名,尽量不要全部使用大写,尽量不要用“_”下划线开头
//系统角色都是大写字母组成
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# 
  • 做到见名知义
[root@localhost ~]# IU_1=28
[root@localhost ~]# echo $IU_1
28
[root@localhost ~]# 
  • 不能使用程序中的保留字,例如if、for等

2.3 变量类型

  • 字符型

    • 含义:字符串类型
  • 数值型

    • 整型:整数
    • 浮点型:包含小数
  • 布尔型

    • true:条件为真
    • false:条件为假

2.4 变量操作

//设置变量
[root@localhost ~]# a=10
//引用变量
[root@localhost ~]# echo $a
10
//撤销变量
[root@localhost ~]# unset a
[root@localhost ~]# echo $a

[root@localhost ~]# 
//变量和单引号、双引号的关系
[root@localhost ~]# a=10
[root@localhost ~]# echo "$a"
10
[root@localhost ~]# echo '$a'
$a
[root@localhost ~]# 

2.5 bas变量类型

2.5.1 本地变量

  • 本地变量,作用域为当前shell进程。对当前shell外的其它shell进程,包括当前shell的父shell、子shell进程均无效,只能当前有效
[root@localhost ~]# yum -y install psmisc
[root@localhost ~]# iu=100
[root@localhost ~]# echo $iu
100
[root@localhost ~]# pstree
 ├─sshd───sshd───sshd───bash───pstree
[root@localhost ~]# bash
[root@localhost ~]# pstree
 ├─sshd───sshd───sshd───bash───bash───pstree
[root@localhost ~]# echo $iu

[root@localhost ~]# 

2.5.2 环境变量

  • 作用域为当前shell进程及其子进程
[root@localhost ~]# export iu=100
[root@localhost ~]# echo $iu
100
[root@localhost ~]# pstree
 ├─sshd───sshd───sshd───bash───bash───pstree
[root@localhost ~]# bash
[root@localhost ~]# pstree
 ├─sshd───sshd───sshd───bash───bash───bash───pstree
[root@localhost ~]# bash
[root@localhost ~]# echo $iu
100
[root@localhost ~]# pstree
   ├─sshd───sshd───sshd───bash───bash───bash───bash───pstree

  • 常用:指定路径
echo 'ecport PATH=/usr/local/apache/bin:$PATH' > /etc/profile.d/httpd.sh
source /etc/profile.d/httpd.sh                 重新读取使其生效

功能说明:以树状图显示运行的程序。

语法:pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>]

补充说明:pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序识别码或用户名称,则会把系统启动时的第一个程序视为基层,并显示之后的所有程序。若指定用户名称,便会以隶属该用户的第一个程序当作基层,然后显示该用户的所有程序。
参数

-a  显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c  不使用精简标示法。
-G  使用VT100终端机的列绘图字符。
-h  列出树状图时,特别标明现在执行的程序。
-H <程序识别码>  此参数的效果和指定”-h”参数类似,但特别标明指定的程序。
-l  采用长列格式显示树状图。
-n  用程序识别码排序。预设是以程序名称来排序。
-p  显示程序识别码。
-u  显示用户名称。
-U  使用UTF-8列绘图字符。
-V  显示版本信息。

2.5.3 位置变量

  • 用来引用脚本的参数
[root@localhost ~]# vim test.sh
[root@localhost ~]# chmod +x test.sh 
[root@localhost ~]# sed -n '1,2p' test.sh 
#!/bin/bash
echo $1 $3 $4 $2 
[root@localhost ~]# ./test.sh 9 8 7 5
9 7 5 8
[root@localhost ~]# 
  • 位置变量使用完以后退出,后面的参数向前推进
 shift [num]

2.5.4 特殊变量

  • $#:是传给脚本的参数的个数
[root@localhost ~]# vim test.sh 
[root@localhost ~]# sed -n '1,2p' test.sh 
#!/bin/bash
echo $#
[root@localhost ~]# ./test.sh 1 1 1
3
[root@localhost ~]# 
  • $0:是脚本本身的名字
[root@localhost ~]# vim test.sh 
[root@localhost ~]# sed -n '1,2p' test.sh 
#!/bin/bash
echo $0
[root@localhost ~]# ./test.sh 1 1 1
./test.sh
[root@localhost ~]# 

  • $@:是传给脚本的所有参数的列表
//@和*的区别:单独个体存放,一个一个取
[root@localhost ~]# vim test.sh 
[root@localhost ~]# sed -n '1,2p' test.sh 
#!/bin/bash
echo $@
[root@localhost ~]# ./test.sh 1 2 5 6 9 8 7 1
1 2 5 6 9 8 7 1
[root@localhost ~]# 
  • $*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
//@和*的区别:当初一个整体存放,在一个一个取
[root@localhost ~]# vim test.sh 
[root@localhost ~]# sed -n '1,2p' test.sh 
#!/bin/bash
echo $*
[root@localhost ~]# ./test.sh 1 2 5 6 9 8 7 1 
1 2 5 6 9 8 7 1
[root@localhost ~]# 

  • $! :是shell最后运行的后台Process的PID

  • $$:是脚本运行的当前进程ID号

  • $?:是显示上条命令的退出状态,0表示没有错误,其他表示有错误

[root@localhost ~]# vim test.sh 
[root@localhost ~]# sed -n '1,3p' test.sh 
#!/bin/bash
ls
ls pengyudong
[root@localhost ~]# sed -n '1,4p' test.sh 
#!/bin/bash
ls
ls pengyudong
echo $?
[root@localhost ~]# ./test.sh 
anaconda-ks.cfg  haproxy  test.sh
ls: 无法访问'pengyudong': 没有那个文件或目录
2
[root@localhost ~]# echo $?
0
[root@localhost ~]# 

.5.5 bash内建环境变量

  • PATH:系统里面所有命令查找的位置
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# 
  • SHELL:当前用的shell是什么,可以修改配置文件修改当前shell
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# usermod -s /bin/sh root
[root@localhost ~]# echo $SHELL
/bin/sh

  • UID:当前用户的uid
[root@localhost ~]# echo $UID
0
[root@localhost ~]# id root 
uid=0(root) gid=0(root)=0(root)
[root@localhost ~]# 
  • HISTSIZE:命令历史的长度
[root@localhost ~]# echo $HISTSIZE
1000
[root@localhost ~]# 
  • HOME:当前用户的家目录
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# 
  • PWD:当前所在的位置
[root@localhost etc]# echo $PWD
/etc
[root@localhost etc]# 
  • HISTFILE:命令历史报存到那个文件去了
[root@localhost etc]# echo $HISTFILE
/root/.bash_history
[root@localhost etc]# 

  • PS1:定义命令提示符的样式
[root@localhost etc]# echo $PS1
[\u@\h \W]\$
[root@localhost etc]# PS1='\W'
etcPS1='[\u@\h \W]\$'
[root@localhost etc]#

2.5.6 只读变量(常量)

  • 不能修改值,不能销毁,只能等shell进程终止时随之消亡
[root@localhost etc]#readonly uu=666
[root@localhost etc]#echo $uu
666
[root@localhost etc]#uu=777
bash: uu: 只读变量
[root@localhost etc]#unset uu
bash: unset: uu: 无法取消设定: 只读 variable
[root@localhost etc]#

3. 脚本基础

3.1 脚本的含义

  • 按实际需要,结合命令流程控制机制实现的源程序。说白点就是命令的堆砌。

3.2 程序返回值

  • 程序执行以后有两类返回值:
    • 程序执行的结果
    • 程序状态返回代码(0-255)
      • 0:正确执行
      • 1-255:错误执行,1、2、127系统预留,有特殊意义

3.3 脚本测试

  • bash -n scriptname:检查脚本是否有语法错误
[root@localhost ~]#vim test.sh 
[root@localhost ~]#cat test.sh 
#!/bin/bash
sl dahdagda
ls /etc/sysconfig/network-scripts
if jsdkasl
[root@localhost ~]#bash -n test.sh 
test.sh:行5: 语法错误: 未预期的文件结尾
[root@localhost ~]#

  • bash -x scriptname:单步执行,检查脚本错在哪里(排查)
[root@localhost ~]#bash -x test.sh 
+ sl dahdagda
test.sh:行2: sl: 未找到命令
+ ls /etc/sysconfig/network-scripts
ifcfg-ens160
test.sh:行5: 语法错误: 未预期的文件结尾
[root@localhost ~]#

3.4 写脚本注意事项

  1. 禁止将未成功执行过的代码直接写入脚本
  2. 脚本中的命令一定要写绝对路径

3.5 shell算数运算

  • let C= $ A+$B :let 算术运算表达式
[root@localhost ~]# cat boat.sh  #加法
#!/bin/bash
let a=$1+$2
echo $a
[root@localhost ~]# bash boat.sh 1 2
3
[root@localhost~]# cat boat.sh  #减法
#!/bin/bash
let a=$1-$2
echo $a
[root@localhost~]# bash boat.sh 9 1
8
[root@localhost ~]# cat boat.sh  #乘法
#!/bin/bash
let a=$1*$2
echo $a
[root@localhost ~]# bash boat.sh 1 5
5
[root@localhost ~]# 
[root@localhost ~]# bash boat.sh 
2.50
[root@localhost ~]# cat boat.sh 
#!/bin/bash


echo 'scale=2;5/2' | bc      #scale保留几位小数,bc需要下载

[root@localhost ~]# 

  • C=$ [$ A+$ B] :$ [算术运算表达式]
[root@localhost ~]#a=$((33+4)) # +/-/*/(/)
[root@localhost ~]#echo $a
37
[root@localhost ~]#
  • C=expr $A + $B :expr 算术运算表达式,表达式中各操作数及运算符之间要有空隔,而且要使用命令引用
[root@localhost ~]#vim test.sh 
[root@localhost ~]#cat test.sh 
#!/bin/bash
a=`expr $1 + $2`
echo $a
[root@localhost ~]#./test.sh 
expr: syntax error: missing argument after “+”

[root@localhost ~]#./test.sh 2 3
5
[root@localhost ~]#

3.6 命令的逻辑关系

  • 逻辑与:&& 两个条件必须都为真,输出才为真

    • 第一个条件为假时,第二个条件不用再判断,最终结果已经有
    • 第一个条件为真时,第二个条件必须得判断
  • 逻辑或:|| 两个条件有一个为真,输出才为真

    • 前一个命令的结果为真时,第二个命令就不执行
    • 前一个命令的结果为假时,第二个命令必须执行
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彭宇栋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值