shell脚本-变量

1、shell脚本基础结构

变量

变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

变量类型

变量类型:

内置变量,如:PS1,PATH,HISTSIZE
用户自定义变量这里是引用

不同的变量存放的数据不同,决定了以下

  1. 数据存储方式
  2. 参与的运算
  3. 表示的数据范围

变量数据类型:

字符
数值:整型、浮点型,bash 不支持浮点数

Shell中变量命名法则

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

变量定义和引用
变量的生效范围等标准划分变量类型

普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数

变量赋值:

name=‘value’

value 可以是以下多种形式

直接字串:name=‘root’
变量引用:name=" U S E R " 命 令 引 用 : n a m e = ‘ C O M M A N D ‘ 或 者 n a m e = USER" 命令引用:name=`COMMAND` 或者 name= USER"name=COMMANDname=(COMMAND)

变量引用:

$name
${name}

弱引用和强引用

" n a m e " 弱 引 用 , 其 中 的 变 量 引 用 会 被 替 换 为 变 量 值 ′ name " 弱引用,其中的变量引用会被替换为变量值 ' name"name ’ 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

显示已定义的所有变量:

set

删除变量:

unset name

范例:

 cat sysinfo.sh
#!/bin/bash
#
#********************************************************************
#Author: liujunjun
#QQ: 1350748936
#Date: 2021-04-06
#FileName: systeminfo.sh
#URL: http://www.liujunjun.com
#Description: Show system information
#Copyright (C): 2021 All rights reserved
#********************************************************************
COLOR="\033[1;31m"
END="\033[0m"
echo -e "\033[1;32m-----------------Host systeminfo---------------$END"
echo -e "HOSTNAME: $COLOR`hostname`$END"
echo -e "IPADDR: $COLOR` ifconfig ens33|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1`$END"
echo -e "OSVERSION: $COLOR`cat /etc/redhat-release`$END"
echo -e "KERNEL: $COLOR`uname -r`$END"
echo -e "CPU: $COLOR`lscpu|grep 'Model name'|tr -s ' '|cut -d : -f2`$END"
echo -e "MEMORY: $COLOR`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"

环境变量

变量声明和赋值:

export name=VALUE
declare -x name=VALUE

变量引用:

$name
${name}

显示所有环境变量:

env
printenv
export
declare -x

删除变量:

unset name

bash内建的环境变量

PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
_ 下划线 表示前一命令的最后一个参数

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

readonly name
declare -r name

查看只读变量:

readonly [-p]
declare -r

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

$1, $2, … 对应第1个、第2个等参数,shift [n]换位置
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ 传递给脚本的参数的个数 注意…@ $* 只在被双引号包起来的时候才会有差异

清空所有位置变量

set –

退出状态码变量
进程执行后,将使用变量 ? 保 存 状 态 码 的 相 关 数 字 , 不 同 的 值 反 应 成 功 或 失 败 , ? 保存状态码的相关数字,不同的值反应成功或失败, ??取值范例 0-255

$?的值为0 代表成功
$?的值是1到255 代表失败

范例:

ping -c1 -W1 hostdown &> /dev/null
echo $?

用户可以在脚本中使用以下命令自定义退出状态码

exit [n]

注意:
脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

展开命令行
展开命令执行顺序

把命令行分成单个命令词
展开别名
展开大括号的声明({})
展开波浪符声明(~)
命令替换$() 和 ``
再次把命令行分成命令词
展开文件通配(*、?、[abc]等等)
准备I/0重导向(<、>)
运行命令

加粗样式

反斜线(\)会使随后的字符按原意解释

范例:

echo Your cost: $5.00
Your cost: $5.00

加引号来防止扩展

单引号(’’)防止所有扩展
双引号(”“)也可防止扩展,但是以下情况例外:$(美元符号)

变量扩展

`` : 反引号,命令替换
\:反斜线,禁止单个字符扩展
!:叹号,历史命令替换

脚本安全和set

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

$- 变量

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 个历史命令

set 命令实现脚本安全

-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项
-x 当执行命令时,打印命令及其参数,类似 bash -x

范例:

set -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
history on
ignoreeof off
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
pipefail off
posix off
privileged off
verbose off
vi off
xtrace off

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值