死磕shell系列----shell脚本变量与安全

 千呼万唤始出来,感谢老铁们的支持,加强了我的学习动力!!!

一、shell脚本变量概述

Shell 作为弱类型动态解释型语言,不像 C++、JAVA 语言编程时需要事先声明变量,Shell给一个变量赋值,实际上就是定义了变量。在 Linux 支持的所有 shell 中,都可以用赋值符号(=)为变量赋值,Shell 变量为弱类型,定义变量不需要声明类型不需要提前强制转换,但在使用时需要明确变量的类型,可以使用 Declare 指定类型。

Declare 常见参数有:
  • +/-     "-"可用来指定变量的属性,"+"为取消变量所设的属性
  • f        仅显示函数
  • r       将变量设置为只读
  • x      指定的变量会成为环境变量,可供 shell 以外的程序来使用
  • i       指定类型为数值,字符串或运算式

而什么是弱类型,什么又是动态呢?(如下图所示)

死磕shell系列----shell脚本变量与安全_第1张图片

静态和动态语言
  • 静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:javac
  • 动态编译语言:不用事先声明,可随时改变类型,如:bashPython
强类型和弱类型语言
  • 强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java c# python
如:以下python代码

print('magedu'+ 10) ### 会提示出错,不会自动转换类型
print('magedu'+str(10)) ### 结果为magedu10,需要显示转换类型
  • 弱类型语言:语言的运行时会隐式做数据类型转换无须指定类型,默认均为字符型参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用,如:bashphpjavascript

二、变量命名规范

  •  不能使程序中的保留字:如:if, for,ls
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”
  • 见名知义,用英文名字,并体现出实际作用
  • 统一命名规则:驼峰命名法, studentname,大驼峰StudentName 小驼峰studentName
  • 变量名(普通变量小写,环境变量大写)
  • 函数名小写  

三、变量的定义与删除

1变量的类型

  变量的生效范围等标准划分变量类型:普通变量、环境变量

  • 普通变量

  生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

1、变量的赋值:
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)

2、显示已定义的所有变量
set

3、删除变量
unset name

死磕shell系列----shell脚本变量与安全_第2张图片

环境变量

  生效范围为当前shell进程及其子进程

1、变量的声明和赋值
export name=VALUE
declare -x name=VALUE

2、显示所有的环境变量
env
printenv
export
declare -x

3、删除变量
unset name

死磕shell系列----shell脚本变量与安全_第3张图片

常见的bash内建的环境变量

  • PATH                     #执行文件查找的路径,目录之间用冒号(:)分隔,从左到右依次查找
  • SHELL                  #当前环境使用的shell类型
  • USER                    #当前状态的用户名
  • HOME                   #当前用户的家目录
  • PWD                      #当前所在的目录(绝对路径)
  • LANG                    #当前系统编码方式,中文编码通常是zh_CN.gb2312 或者 zh_CN.UTF-8
  • MAIL                      #使用mail命令时,系统读取的邮件信箱文件(绝对路径)
  • HOSTNAME          #当前所用主机的主机名
  • HISTSIZE              #被系统记录的历史命令条数
  • _   下划线              #表示前一命令的最后一个参数
  • RANDOM              #随机数变量,随机生成0~~32767之间的数
  • PID                        #当前shell进程的pid

 2、 其他类型的变量

  • 只读变量

  只声明定义,但后续不能修改和删除

声明只读变量:
readonly name
declare -r name

查看只读变量
readonly [-p]
declare -r
  • 位置变量

在bash shell中的内置变量,在脚本代码中调用通过命令行传递给脚本的参数

  • $1, $2, ...$n   对应第1个、第2个,...第n个等参数
  • $0       当前脚本名称,包括路径
  • $*       传递给脚本的所有参数,全部参数合为一个字符串
  • $@     传递给脚本的所有参数,每个参数为独立字符串
  • $#       传递给脚本的参数个数
  • $?       命令或程序执行完后的状态,返回值为0, 表示执行成功
  • $$       程序本身的PID号

注意,$@、$* 只在被双引号包起来的时候才会有差异

 
清空所有位置变量
set --

四、命令行和脚本安全

set 命令:可以用来定制shell环境

1、$- 变量

  • h:    hashall,打开选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选 项关闭
  • i:     interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell, 在脚本中,i选项是关闭的
  • m:   monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等
  • B:    braceexpand,大括号扩展
  • H:    history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的 一个历史命令“!n”返回第 n 个历史命令

死磕shell系列----shell脚本变量与安全_第4张图片

2、set 命令实现脚本安全

下面列举一些常见的参数:(想查看更多可以使用 help set

  • -u    在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
  • -e    如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
  • -o    option 显示,打开或者关闭选项  

显示选项:set -o

打开选项:set -o 选项

关闭选项:set +o 选项

  • -x    当执行命令时,打印命令及其参数,类似 bash -x

死磕shell系列----shell脚本变量与安全_第5张图片

 

你可能感兴趣的:(死磕运维之路,shell,linux)