shell变量

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+=2i=i+2
i - =2i=i-2
i *=2i=i*2
i/=2i=i/2
i%=2i=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.34B=56.78
[root@svr1 ~]# echo "$A<=$B"  | bc
1
[root@svr1 ~]# echo "$A>$B"  | bc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值