shell变量
什么是变量
以固定名称存放,可能会变化的值。
- 提高脚本对任务需求,运行环境变化的适应能力
- 方便在脚本中重复使用
定义/赋值/查看/取消变量
- 变量名=变量值
[root@svr1 ~]# test=11 //新建变量test,赋值"11"
[root@svr1 ~]# echo $test //通过set命令可以检查变量设置
11
//若变量名称与后面要输出的字符串连在一起,则应该以{}将变量名括起来以便区分:
[root@svr1 ~]# echo $testRMB //无法识别变量名test
[root@svr1 ~]# echo ${test}RMB //区分后可以识别
11RMB
[root@svr1 ~]# unset test //撤销变量test
[root@svr1 ~]# echo $test //查看时已无结果
相关注意事项:
1.若指定的变量名已存在,相当于为此变量重新赋值
2.等号两边不要有空格
3.变量名由字母/数字/下划线组成,区分大小写
4.变量名不能以数字开头,不要使用关键字和特殊字符
shell变量的分类角度
- 存储类型
整数型、浮点型、双精度浮点型、字符型…
shell脚本语言对存储类型要求比较松散 - 使用类型
类型 | 说明 |
---|---|
环境变量 | 变量名通常都大写,由系统维护,用来设置工作环境 ,只有个别变量用户可直接修改 |
位置变量 | bash内置,存储执行脚本时提供的参数 |
预定义变量 | bash内置,一类有特殊用途的变量,可直接调用,但不能直接赋值或修改 |
自定义变量 | 由用户自主设置、修改及使用 |
环境变量
- 配置文件:
全局文件为/etc/profile,对所有用户有效;
用户文件为~/.bash_profile,仅对指定的用户有效。
[root@svr5 ~]# cat /etc/profile //查看/etc/profile文件内容:
.. ..
HOSTNAME='/bin/hostname'
HISTSIZE=1000
.. ..
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
.. ..
- 相关操作
env列出所有环境变量
set列出所有变量(包括env能看到的环境变量)
[root@svr1 src]# env //列出所有环境变量
HOSTNAME=svr1.tarena.com
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.4.110 59026 22
OLDPWD=/root
SSH_TTY=/dev/pts/0
USER=root
.. ..
[root@svr1 src]# set //查看所有变量
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
.. ..
-
常见环境变量
PWD、PATH、USER、LOGNAME、UID、SHELL、HOME、PS1、PS2 ······ -
使用环境变量
当前用户的环境变量
USER记录了用户名、
HOME记录了宿主目录、
SHELL记录了登录Shell、
HOSTNAME记录主机名、
UID是用户的id号
[root@svr1 ~]# echo $USER $HOME $SHELL $UID
root /root /bin/bash 0
[root@svr1 ~]# echo $HOSTNAME
svr1
PS1表示Shell环境的一级提示符,即命令行提示符(\u 用户名、\h 主机名、\W 工作目录、$ 权限标识)
[root@svr1 src]# echo $PS1 //查看默认的一级提示
[\u@\h \W]\$
[root@svr1 src]#PS1='hehe#' //修改一级提示
hehe# //更改结果
hehe# PS1='[\u@\h \W]\$ ' //恢复原有设置
PS2表示二级提示符,出现在强制换行、at任务编辑等场合:
[root@svr1 ~]# echo $PS2 //查看默认的二级提示
>
[root@svr1 src]# cd \ //强制换行,观察提示符效果
> /root/
[root@svr1 ~]# PS2='=> ' //手动修改二级提示
[root@svr1 ~]# cd \ //再次验证提示符效果
=> ~
[root@svr1 ~]# PS2='> ' //恢复原有设置
位置变量
- 在执行脚本时提供的命令行参数
表示为$n ,n为序号
$1、 2 、 ⋅ ⋅ ⋅ 、 2、···、 2、⋅⋅⋅、{10}、${11}···
预定义变量
- 用来保存脚本程序的执行信息
不能直接使用这些变量。
不能直接为这些变量赋值。
变量名 | 含义 |
---|---|
$0 | 当前所在的进程或脚本名 |
$$ | 当前运行进程的PID号 |
$? | 命令执行后的返回状态,0表示正常,1或其他值表示异常 |
$# | 已加载的位置变量的个数 |
$* | 所有位置变量的值 |
- 创建一个测试脚本,用来展示。
[root@svr1 ~]# vim location.sh
#!/bin/bash
echo $0 //脚本的名称
echo $1 //第一个参数
echo $2 //第二个参数
echo $* //所有参数
echo $# //所有的综合
echo $$ //当前进程的进程号
echo $? //上一个程序的返回状态码
[root@svr1 ~]# chmod +x location.sh //添加可执行权限
[root@svr1 ~]# ./location.sh one 1 2 abc qq 8 7 //执行脚本location.sh,细心观察结果。
变量值及范围控制
扩展赋值操作
- 区分三种界定符
双引号 " " :允许扩展,以 $ 引用其他变量
单引号 ’ ’ :禁止扩展,即便 $ 也视为普通字符
反撇 `` :将命令的执行输出作为变量值,等效于$()
[root@svr1 ~]# echo "当前的用户是: $USER"
当前的用户是:root
[root@svr1 ~]# echo '当前的用户是: $USER'
当前的用户是: $USER
[root@svr1 ~]# echo 当前的工作目录是: $(pwd)
当前的工作目录是: /root
[root@svr1 ~]# xx=Tarena IT Group
-bash: IT: command not found //未界定时赋值失败
[root@svr1 ~]# xx="Tarena IT Group" //界定后成功
[root@svr1 ~]# touch aa bb //创建了两个文件
[root@svr1 ~]# touch "aa bb" //创建了一个文件
[root@svr1 ~]# ls //查看结果
[root@svr1 ~]# test=11
[root@svr1 ~]# echo "$test"
[root@svr1 ~]# echo '$test'
read标准输入取值
- read 从键盘读入变量值完成赋值
格式: read [ -p “提示信息”] 变量名
-p 可选,-t 可指定超时秒数
//执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量str
[root@svr1 ~]# read str
What's happen ? //随便输入一些文字,按Enter键提交
[root@svr1 ~]# echo $str //查看赋值结果
What's happen ?
//为了不至于使用户不知所措、莫名其妙,推荐的做法是结合-p选项给出友好提示:
[root@svr1 ~]# read -p "请输入一个整数:" i
请输入一个整数:240
[root@svr1 ~]# echo $i
240
- 终端显示控制
stty -echo:关闭终端输出(无显示)
stty echo:恢复终端输出(显示)
[root@svr1 ~]# vim user.sh //创建一个测试脚本
#!/bin/bash
read -p "请输入用户名:" username //读取用户名
stty -echo //关闭回显
read -p "请输入密码:" passwd //读取密码
stty echo //恢复回显
echo "" //恢复回显后补一个空行
useradd "$username"
echo "$passwd" | passwd --stdin "$username"
[root@svr1 ~]# chmod +x user.sh //添加执行权限
[root@svr1 ~]# ./user.sh
请输入用户名: root //输入root,回车
请输入密码:
整数运算
expr运算工具
- 计算指定的表达式,并输出结果
- 格式: expr 整数1 运算符 整数2 ······
- 乘法操作应采用 * 转译,避免被作为shell通配符
类型 | 运算符 | 示例 |
---|---|---|
加法 | + | expr 21 + 14、expr $X + $Y |
减法 | - | expr 34 - 21、expr $X - $Y |
乘法 | * | expr 5 * 12、expr $X * $Y |
除法 | / | expr 35 / 7、expr $X / $Y |
取余数 | % | expr48 % 7、expr $X % $Y |
[root@svr1 ~]# X=1234 //定义变量X
[root@svr1 ~]# expr $X + 78 //加法
1312
[root@svr1 ~]# expr $X - 78 //减法
1156
[root@svr1 ~]# expr $X \* 78 //乘法,操作符应添加\转义
96252
[root@svr1 ~]# expr $X / 78 //除法,仅保留整除结果
15
[root@svr1 ~]# expr $X % 78 //求模
64
$[ ]算式替换
- 使用 $[ ] 或 $(( )) 表达式
格式: $[ 整数1 运算符 整数2 ······ ]
乘法操作无需转译,运算符两侧可以无空格
引用变量可省略 $ 符号
计算结果替换表达式本身,可结合echo输出
[root@svr1 ~]# X=1234
[root@svr1 ~]# echo $[X+78]
1312
[root@svr1 ~]# echo $[X-78]
1156
[root@svr1 ~]# echo $[X*78]
96252
[root@svr1 ~]# echo $[X/78]
15
[root@svr1 ~]# echo $[X%78]
64
变量的自增 / 减等操作
- 使用 $ [ ] 替换,或者let命令
结合echo命令查看结果
简写表达式 | 完整表达式 |
---|---|
i ++ | i=i+1 |
i - - | i=i-1 |
i+=2 | i=i+2 |
i - =2 | i=i-2 |
i *=2 | i=i*2 |
i/=2 | i=i/2 |
i%=2 | i=i%2 |
[root@svr5 ~]# X=1234
[root@svr5 ~]# let y=X+22
[root@svr5 ~]# echo $y
1256
[root@svr5 ~]# let X++; echo $X // X++(X=X+1)
[root@svr5 ~]# let X--; echo $X // X--(X=X-1)
[root@svr5 ~]# let X+=78 ; echo $X // X+=78(X=X+78)
[root@svr5 ~]# let X-=78 ; echo $X // X-=78(X=X-78)
[root@svr5 ~]# let X*=78 ; echo $X // X*=78(X=X*78)
[root@svr5 ~]# let X/=78 ; echo $X // X/=78(X=X/78)
[root@svr5 ~]# let X%=78 ; echo $X // X%=78(X=X%78)
小数运算
- 使用bc实现小数计算
多数Linux系统默认安装此工具
直接运行bc可进入交互式运算界面,quit退出
设置scale=n 可约束小数位
[root@svr1 ~]# bc //打开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'.
12.34+56.78 //加法
69.12
12.34-56.78 //减法
-44.44
12.34*56.78 //乘法
700.66
scale=3 //讲可用的小数位增加为3
12.34*56.78 //乘法,重新输出
700.665
12.34/56.78 //除法
0
quit //退出交互计算器
[root@svr1 ~]# echo 'scale=4;12.34+5.678' | bc //bc非交互式
18.018
[root@svr1 ~]# echo 'scale=4;12.34*5.678' | bc
70.0665
[root@svr1 ~]# echo 'scale=4;12.34/5.678' | bc
2.1733
- 小数比较
echo “数值1 比较符 数值2 ” | bc
如果表达式成立,则返回的计算结果为1,反之为0
常见比较符号 : >、>=、<、<=、==、!=
[root@svr1 ~]# A=12.34;B=56.78
[root@svr1 ~]# echo "$A<=$B" | bc
1
[root@svr1 ~]# echo "$A>$B" | bc