shell脚本 变量和条件语句

19 阅读1分钟

变量

一、变量是什么

  • 变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

  • 变量即在程序运行过程中它的值是允许改变的量。

  • 变量是用一串固定的字符串去表示不固定的内容。

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

二、shell变量的类型包括:

自定义变量:由用户自己定义,可以修改和使用,但是要避免改成已存在的命令或关键字。

环境变量:由系统维护,用于设置工作环境 可以用env命令查看(与系统有关可以修改,例如:$PATH规定了命令路径和补全)

只读变量:只可以读取不可以更改的变量(其实就是常量,不常用)

位置变量:通过命令行给脚本传递参数

预定义变量:Bash中内置的一类变量,不能修改。有些规定好的变量 放在那里让你使用(属于系统变量,一般不可修改)

如何自定义变量

shell变量不分数据类型
变量名=变量值
  a  =  10
[root@localhost ~]# a=10         //设置变量
[root@localhost ~]# echo $a      //shell $变量名  调用变量
10

三、变量的命名要求

  • 区分大小写
  • 不能使程序中的保留字和内置变量:如:if, for,hostname 。
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反。
  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,如 PATH 。
  • 大驼峰 StudentFirstName,字母开头需要大写。
  • 小驼峰 studentFirstName,字母中间需要大小。
  • 下划线 student_name。
name='value' 
变量名=变量值 直接字串:name='root' 
变量引用:name="$USER" 
命令引用:name=`COMMAND` 或者 name=$(COMMAND) 

注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除。如果想要永久使用变量需要将变量写入文件./bashrc/etc/profile中。

常用四大符号

  • { } 大括号 :确定变量起始结束的范围,这种只要有变量就先加上,不加的话有可能会引发错误。

  • " " 双引号(弱引用(smart),可以识别变量

  • ' ' 单引号 :强引用(stupid),不识别变量,输入什么就显示什么

  • `` 反撇 :调用命令执行结果 ,效果与 $( )相同

四、自定义设置变量

unset 变量名 取消变量  

变量名+=追加值 追加变量的值

[root@localhost ~]# sergeancy=zhu            //设置变量
[root@localhost ~]# echo $sergeancy          
zhu
[root@localhost ~]# sergeancy+=xiaolong     //变量名+=追加值增加变量内容
[root@localhost ~]# echo $sergeancy 
zhuxiaolong                                 //显示结果

read [-p “提示信息” ] 变量名 自定义变量

创建一个简易的正整数计算器
[root@localhost zhubao]# vim zhutou.sh     //建立一个脚本

#!/bin/bash
#
read -p "输入一个正整数" a                  //自定义交互变量
read -p "输入一个正整数" b

expr $a + $b                              //仅支持正整数

[root@localhost zhubao]# bash zhutou.sh   //执行脚本
输入一个正整数116                          //输入正整数
输入一个正整数225
341                                       //得出结果

五、变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量(即环境变量),使用户定义的变量在所有子shell环境中可以继续使用。

[root@localhost zhubao]# zhu=fu           //设置局部变量zhu
[root@localhost zhubao]# echo $zhu        
fu
[root@localhost zhubao]# bash            //进入子bash环境
[root@localhost zhubao]# echo $zhu       //查看子bash环境中的zhu变量
                                         //发现无效
                                         
[root@localhost zhubao]# pstree -p|grep bash   //查看当前bash环境,发现现处于子bash
           |-sshd(1139)---sshd(1186)---bash(1463)---bash(3017)-+-grep(3069)                                         
[root@localhost zhubao]# exit            //退出当前bash环境
exit
[root@localhost zhubao]# echo $zhu       //再次输入zhu变量又恢复
fu
[root@localhost zhubao]# export zhu      //export 变量名 (想要子shell也同步变量可使用export定义全局变量)
[root@localhost zhubao]# bash            //再次进入子bash环境
[root@localhost zhubao]# echo $zhu       //再次再该bash环境中输入可得到变量数值
fu

六、环境变量

  1. 由系统提前创建,用来设置用户的工作环境
  2. 可以使用env命令查看所有环境变量
  3. 需要记住的常用环境变量
[root@localhost ~]# env  //可以查看到所有的环境变量


常用环境变量:
   $USER 表示用户名称
   $HOME 表示用户的宿主目录
   $LANG 表示语言和字符集
   $PWD 表示当前所在工作目录
   $PATH 表示可执行用户程序的默认路径

  1. 环境变量的特性:
  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程。
  • 一般只在系统配置文件中使用,在脚本中较少使用。

5.环境变量的配置文件:

自定义的环境变量只是临时生效,退出系统后就会失效。需要将自定义的环境变量放入配置文件中,才会永久生效。配置文件可以用来长期变更或设置环境变量。

全局配置文件:/etc/profile,修改此文件会作用于所有用户。

用户独立的配置文件: ~/.bash_profile,修改这个文件只作用于当前用户。

七、只读变量

在定义shell变量时,默认定义的变量是可以被修改的,但有一种变量是不能修改的,就是只读变量。

只读变量只能被赋值一次。只读变量在取得初始值之后,只能进行读取操作,不能重新赋值或删除。

root@localhost ~]# name=zhubao               //设置一个变量
[root@localhost ~]# readonly name            //使用readonly 表面只读,无法更改
[root@localhost ~]# echo $name
zhubao
[root@localhost ~]# name=zhutou              //无法重新赋值
bash: name: 只读变量                          //相当于是常量
[root@localhost ~]# unset name               //更无法删除
bash: unset: name: 无法反设定: 只读 variable

想要删除该只读变量只能reboot重启

八、位置变量

位置变量也称为位置参数。

使用$n表示,n为数字序列号,且必须为整数。

如:$1$2、…、$9 、${10}${11}这代表了实行脚本后的第多少个参数。

两位数需要加花括号{},不然$10会被识别为:$1和0

例如该脚本为计算器脚本
[root@localhost zhu]# vim jsq.sh            //建立一个计算器脚本

#!/bin/bash               

#read -p "请输入第一个正整数" n 
#read -p "请输入第二个正整数" m 

echo  $[$1+$2]                              //$[$1+$2](第一参数+第二参数)
[root@localhost zhu]# bash jsq.sh 116 225   //运行脚本可得出结果
341
[root@localhost zhu]# vim data.sh 
#!/bin/bash
echo $1           //位置一参数
echo $2           //位置二参数
echo $3           //位置三参数...
echo $4
echo $5           //如果遇到双数需要把当前参数加上大括号{},否则会默认成两个个位数组成。
[root@localhost zhu]# bash data.sh {a..z}    //对应参数按顺序打印a-z字母,
a
b
c
d
e

九、预定义变量

预定义变量是系统定义好的变量,用来保持脚本程序的执行信息。

可以直接使用这些变量,不能直接为这些变量赋值。

变量作用
$?显示上一次执行命令结果是否正确。反馈 0 表示执行正确,反馈任何非 0值均表示执行出现异常。
$*表示所有位置参数的内容。当整体返回。(将输入的参数作为一个单词)
$@表示所有位置参数的内容。当个体返回。可作为数组。(将参数内容分割成n份,每份作为独立个体)
$#表示命令行中位置参数的总个数。
$0表示当前脚本名称(如果是软链接,显示当前软链接文件名)。
$_表示在此之前执行的命令或脚本的最后一个参数。
$$获取当前bash进程的PID。

shell中的变量运算

shell中的运算

  • 运算内容:(加 +)、 (减 -)、 (乘 *)、 (除 /)、 取余(取模)%
  • 运算符号:$[] 和 $(())
  • 运算命令:expr和 let
  • 运算工具:bc (系统自带)

运算符:

  • 加法 + (num1 + num2)
  • 减法 - (num1 - num2)
  • 乘法 \ * (num1 \ * num2)
  • 除法 / (num1 / num2)
  • 取余 (取模)% (num1 % num2 (求 num1 除以 num2 的余数))

运算演示:

默认情况下bash只支持整数运算,不支持小数运算,bc可以计算小数。

echo $[算术表达式]                          //echo进行调用

[root@localhost ~]# echo $[1+6]            
7
[root@localhost ~]# echo $[2+5]
7
[root@localhost ~]# echo $[12/6]
2
[root@localhost ~]# echo $[2*6]
12
[root@localhost ~]# echo $[11/6]          //这样运算会自动排除小数
1
[root@localhost ~]# echo $[1.1/6]
-bash: 1.1/6: 语法错误: 无效的算术运算符 (错误符号是 ".1/6")   //无法进行小数运算

可运用变量进行运算

[root@localhost ~]# z=225
[root@localhost ~]# f=116
[root@localhost ~]# echo $[z+f]
341
[root@localhost ~]# echo $[z*f]
26100
[root@localhost ~]# echo $[z/f]
1
[root@localhost ~]# let z=2+5        //let特殊符号的运算
[root@localhost ~]# echo $z
7
[root@localhost ~]# i=1              //设置一个变量
[root@localhost ~]# let i++          //自加一
[root@localhost ~]# echo $i
2
[root@localhost ~]# let i--          //自减一
[root@localhost ~]# echo $i
1