AI智能
改变未来

shell中的变量及调用

shell变量

什么是变量

·以固定名称存放 可能会变化的值

-提高脚本对任务需求 运行环境变化的适应能力

-方便在脚本中重复使用

 

定义/赋值/查看变量

·定义/赋值变量

-变量名=变量值

[root@svr5~]# x=12    //定义变量x 赋值12

[root@svr5~]#var1=centos  //定义变量 赋值centos

 

 

查看变量

-应用变量值:$变量名

-查看变量值:echo $变量名 ,echo ${变量名}

 

取消变量

·变量失效

-退出定义变量shell环境时 变量会自动失效

-也可以手动取消:unset 变量名 .. ..

 

变量的种类

 

Shell变量的分类角度

·存储类型

-整数型 浮点型 双精度浮点型 字符型.. ..

-shell脚本语言对存储类型的要求比较松散

使用类型

 

 

环境变量

·配置文件

-/etc/profile , ~/.bash_profile

·相关操作

使用环境变量

1)查看环境变量相关文件

全局文件为/etc/profile,对所有用户有效;

用户文件为~/.bash_profile,仅对指定的用户有效。

查看/etc/profile文件内容:

  1. [root@svr5 ~]# cat /etc/profile
  2. .. ..
  3. HOSTNAME=`/bin/hostname`
  4. HISTSIZE=1000
  5. .. ..
  6. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
  7. .. ..

使用环境变量

当前用户的环境变量USER记录了用户名、HOME记录了宿主目录

SHELL记录了登录Shell、HOSTNAME记录主机名、UID是用户的id号:

 

-env:列出所有的环境变量

-set:列出所有的变量

  1. [root@svr5 src]# env
  2. HOSTNAME=svr5.tarena.com
  3. SHELL=/bin/bash
  4. HISTSIZE=1000
  5. SSH_CLIENT=192.168.4.110 59026 22
  6. OLDPWD=/root
  7. SSH_TTY=/dev/pts/0
  8. USER=root
  9. .. ..

使用set可查看所有变量(包括env能看到的环境变量):

copytextpop-up

  1. [root@svr5 src]# set
  2. BASH=/bin/bash
  3. BASH_ARGC=()
  4. BASH_ARGV=()
  5. BASH_LINENO=()
  6. .. ..

预定义变量

·用来保存脚本程序的执行信息

-直接使用这些变量

-不能直接为致谢变量赋值

 

 

位置变量

在执行脚本时提供的命令行参数

-表示为 $n , n为序号

-$1,$2,$3 .. .. ${10},${11} .. ..

使用位置变量与预定义变量

1)创建一个测试脚本,用来展示。

copytextpop-up

  1. [root@svr5 ~]# vim location.sh
  2. #!/bin/bash
  3. echo $0                                        //脚本的名称
  4. echo $1                                        //第一个参数
  5. echo $2                                        //第二个参数
  6. echo $*                                        //所有参数
  7. echo $#                                        //所有的综合
  8. echo $$                                        //当前进程的进程号
  9. echo $?                                        //上一个程序的返回状态码
  10. [root@svr5 ~]# chmod +x location.sh              //添加可执行权限

 

 

read标准输入取值

·read从键盘读入变量值完成赋值

-格式:read [-p”提示信息”]  变量名

–  -p可选 -t可指定超时秒数

·终端显示控制

-stty  -echo: 关闭终端输出(无显示)

-stty   echo: 恢复终端输出(显示)

 

变量的作用范围

·局部变量

-新定义的变量默认只在当前shell环境中有效

-无法在子shell环境中使用

·全局变量

-全局变量在当前shell及子shell及子shell环境中均有效

-使用export可将局部变量声明为全局变量

语法:export 局部变量名=局部变量值 .. ..  :为局部变量添加全局属性

      Export -n 全局变量名 .. ..  :取消指定变量的全局属性

 

数值运算

基本运算类别

四则运算

加法: num1 + num2

加法: num1 + num2

乘法:   num1 * num2

整除:   num1 / num2

取余数运算

求模:   num1 % num2

 

expr运算工具

·计算指定的表达式,并输出结果

-语法:expr 整数1 运算符 整数2 .. ..

-乘法操作应采用 \\* 转义,避免被作为shell通配符

类型 运算符 示列

加法    + expr 43 + 21, expr $X + $Y

减法    _ expr 43 – 21, expr $X – $Y

乘法    \\* expr 43 \\* 21, expr $X \\* $Y

除法    / expr 43 / 21, expr $X / $Y

取余    % expr 43 % 21, expr $X % $Y

 

$[]算式替换

·使用$[]或$(())

-格式:$[整数1 运算符 整数2 .. .. ]

-乘法操作*无需转义,运算符两侧可以无空格

-引用变量可以省略 $ 符号

计算结果替换表达式本身,可结合echo命令输出

[root@svr5~]# X=43

[root@svr5~]# echo $[X+21]

64

[root@svr5~]#echo $((X-21)),$((X*21))

22,903

 

变量的自增/减等操作

·使用$[ ]替换,或者let命令来完成

-结合echo命令查看结果

 

 

小数运算

·Bash内键机制仅支持整数值运算

-expr命令 $[ ] 算式替换 不支持有小数的运算

 

使用bc实现小数运算

·多数linux系统默认安装此工具

-支持高精度的数值运算

-直接运行bc可进入交互式运算界面,quit 退出

-设置 scale=n 可以约束小数位

结合管道性bc发送表达式

-多个表达式可以以分号分隔

-通过echo命令+管道传递要计算的表达式

[root@svr5~]# A=12.34

[root@svr5~]# echo “$A*56.789”| bc

700.776

[root@svr5~]#echo “scale=4;$A*56.789;5/3”| bc

700.7762

1.6666

 

小数值的比较

·基本用法

-echo  “数值1  比较符  数值2” | bc

-如果表达式成立,则返回的计算结果位1,否则返回0

-常见比较操作:>  >=  <  <=  ==  !=

[root@svr5~]# A=12.34; B=56.78

[root@svr5~]# echo “$A <= $B” | bc  //A是否小于或等于B

1

[root@svr5~]# echo “$A > $B” | bc    //A是否大于或等于B

0

 

在变量中报错中: command 农田found

分析原因

Shell中的变量名

-变量名称不可以使用数字开头

-变量名不可以位特殊字符

-变量名可以为字母 数字 下划线

变量的调用

·故障错误信息

[root@svr5~]# test=12

[root@svr5~]# echo test

Test

[root@svr5~]# echo $testyuan

 

原因分析

·分析故障

-调用变量未获得预期的值

 

·分析故障原因’

-调用变量时需要使用$变量名

-调用变量时,为了防止歧义需要使用{}

 

 

Read 命令故障错误信息

[root@svr5~]# Read -p “please input pass:”pass

Please input pass:pass

[root@svr5~]# echo $pass

 

[root@svr5~]#

 

原因分析

·分析故障

-read提示符和变量之间缺少空格

-导致读取变量内容为空

 

分析故障原因

-因为没有空格,read将提示符和变量识别为一个整体

 

算术运算问题现象

·故障错误信息

[root@svr5~]# expr 1+2

1+2

[root@svr5~]# ecpr 10*5

Expr:syntax error

[root@svr5~]# echo $[3.14*2 ]

3.14*2:syntax error:invalid arithmetic operatot(error token is “.14*2”)

 

原因分析

·分析故障

-报错信息:无正确运算结果

-报错信息:syntax error

-报错信息::invalid arithmetic operator

·分析故障原因

-使用expr运算时,运算符号两边需要有空格

-expr进行乘法运算时,需要使用你\\屏蔽*

-expr无法进行小数运算

 

Shell 流程控制(循环结构)

 

Shell脚本的智能化

·使shell脚本获得识别能力

·为命令的执行提供最直接的识别依据

-文件或目录的读/写等状态

-数值的大小

-字符串是否匹配

-多条件组合

 

Test测试操作

·语法格式

-test 选项 参数

-[ 选项 参数]

Help test  查阅帮助

 

常见的测试操作

字符串的比较

·[ 操作符 字符串 ]

操作符 含义

-z 字符串的值为空

-n 字符串的值不为空(相等于!-z)

·[ 字符串1 操作符 字符串2 ]

操作符 含义

== 两个字符串相同

!= 两个字符串不相同

 

数值的比较

·[ 整数值1 操作符 整数值2 ]

操作符 含义

-eq 等于(Equal)

-ne 不等于(not Equal)

-ge 大于等于

-gt 大于

-le 小于等于

-lt 小于

 

文件的状态测试

·[ 操作符  文件或目录]

 

 

 

组合多个条件

逻辑分割操作

·主要用法

-命令1 操作符 命令2

-[ 条件1 ] 操作符 [ 条件2 ]

 

 

但分支结构

语法格式及特点

·当“条件成立”时执行命令序列

·否则,不执行任何操作

 

 

 

 

双分支结构

语法格式及特点

·当“条件成立”时执行命令序列1

·否则,执行命令序列2

 

 

 

 

 

 

多分枝结构

 

语法格式及特点

·相当于if语句嵌套

·针对多个条件分别执行不同的操作

 

 

 

 

 

 

循环结构

for循环

语法结构及特点

·遍历/列表是循环

-根据变量的不同取值,重复执行命令序列

 

 

 

 

 

 

 

 

While循环

语法结构及特点

·条件是循环

-反复测试条件,只要成立就执行命令序列

 

 

 

 

 

Case语句分支结构

 

Case语法结构及特点

·检查变量的实际取值

-如果与预设的值相匹配,则执行对应的操作

 

 

 

 

 

 

函数及终端控制

 

关于函数的认识

·什么是函数

-在shell环境中,将一些需要重复使用的操作,定位公共的语句块,即可成为函数

·使用函数的好处

-使用脚本代码更简洁,增强易读性

-提高shell脚本的执行效率

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » shell中的变量及调用