自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read

文章目录

  • 1. 什么是变量
  • 2. 变量设置规则
  • 3. 变量的分类
  • 4. 用户自定义变量
  • 5. 环境变量
    • 5.1 环境变量是什么
    • 5.2 设置环境变量
      • 5.2.1 定义环境变量
      • 5.2.2 查询环境变量
      • 5.2.3 清空环境变量
    • 5.3 系统常见环境变量
      • 5.3.1 PATH
      • 5.3.2 PS1
  • 6. 位置参数变量
    • 6.1 $n
    • 6.2 $* $@ $#
  • 7.预定义变量
    • 7.1 $?
    • 7.2 $$ $!
  • 8. 接收键盘输入read

1. 什么是变量

变量可以解释为可以变的量。

在计算机中,变量就是计算机中的内存单元,其中存放的值可以改变

当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把他存放在一个变量中

每个变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

2. 变量设置规则

变量名称可以由字母、数字和下划线组成,但是不能以数字开头

  • 如果变量名是“2name”则是错误的。

在这里插入图片描述

在bash中变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。

在这里插入图片描述
变量是=连接,=两侧不能有空格

如果变量的值有空格,用单引号或双引号包括

在这里插入图片描述变量的值中,可以用“\”转义符

如果需要增加变量的值,可以进行变量值的叠加。不过变量要用双引号包含“$变两名”或用${变量名}包含。

如果将命令的结果作为变量值赋予变量,则需要用反引号或$( )包含命令

在这里插入图片描述
环境变量的名称建议大写,便于区分。环境变量所有的shell都可以使用,命令也是所有的shell都可以使用,所以为了区分环境变量与命令,使用大写。

3. 变量的分类

用户自定义变量

  • linux中最常用变量,特点变量名,变量的值或内容,用户都可以自由定义
  • 这也是使用最为常见通用的变量

环境变量

  • 这种变量中主要保存的是和系统操作环境相关的数据
  • 有一部分和系统操作相关的变量他的名字是事先规定好了,我们能做的就是查查有什么,最多改变他的值
  • 你可以自己定义新的环境变量和环境变量值

位置参数变量

  • 这种变量主要是向脚本中传递参数或数据的,变量名不能自定义,变量作用也是固定的,只能改变变量的值。

预定义变量

  • bash中已经定义好的变量,变量名不能自定义,变量作用也是固定好的
  • 位置参数变量是预定义变量中的一种,只是位置参数变量较多,单独称为一种。

4. 用户自定义变量

定义一个变量:

变量名=“变量 值”

用户自定义的变量只对这个用户起作用,你可以

有空格用单双引号包含起来

在这里插入图片描述
变量是可以叠加的,只需要用双引号阔起来调用就可以了

在这里插入图片描述查看变量:

set # 查看系统当中所有的变量

包括环境变量,系统变量,还有自定义的一些变量。

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第1张图片
变量删除:

unset name

在这里插入图片描述

用户自定义的变量只对这个用户起作用,你可以将这个变量写入用户级环境变量文件中:

在这里插入图片描述
自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第2张图片

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:用户级变量是对这个用户的所有环境而言,而一旦切换用户,别的用户环境中时没有任何有关此变量的信息的

5. 环境变量

这种变量中主要保存的是和系统操作环境相关的数据

有一部分和系统操作相关的变量他的名字是事先规定好了,我们能做的就是查查有什么,最多改变他的值

你可以自己定义新的环境变量和环境变量值

5.1 环境变量是什么

自定义变量只在当前的shell中生效

环境变量会在当前shell和这个shell的所有子shell当中生效

如果把环境变量写入相应的配置文件中,那么这个环境变量就会在所有的shell中生效

5.2 设置环境变量

5.2.1 定义环境变量

设定一个环境变量的值:

export 变量名=变量值  # 申明变量

export就是把这个变量申明为全局变量,让所有的shell当中都可以查看到这个变量。

如何生成一个子shell:

在这里插入图片描述在这里插入图片描述自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第3张图片现在退出,是退出的是子shell:

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第4张图片
现在在父子shell中测试环境变量

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第5张图片自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第6张图片

而且定义一个环境变量所有的用户都可以看到并使用:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第7张图片

5.2.2 查询环境变量

之前我们使用set查询变量,set是可以查看到所有的变量,但是他太多了,我们还是使用专门查看环境变量:

env

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第8张图片

5.2.3 清空环境变量

unset 变量名

在这里插入图片描述

5.3 系统常见环境变量

5.3.1 PATH

PATH:是系统查找命令的路径。

大部分的系统命令都是2进制的可执行文件,他不需要绝对路径就可执行,就是因为PATH环境变量

在这里插入图片描述
输入一个命令,系统在上述路径中寻找,没有找到就报错

在这里插入图片描述建立一个自己的命令:

在这里插入图片描述
在这里插入图片描述
现在将hello脚本拷贝到PATH搜索路径的目录当中

在这里插入图片描述
我们不推荐改变系统的原有结构,我们更习惯的是用变量垒加,把自己的命令加进去:

PATH="$PATH":/root/sh

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第9张图片
这样不会改变系统的原始结构。

5.3.2 PS1

PS1:定义系统提示符的变量

[root@study sh]# 

我们看看可以修改那些选项:

\d 显示日期,格式为“星期 月 日”
\h 显示简写主机名,如默认主机名“localhost”
\t 显示24小时制时间,格式为“HH:MM:SS”
\T 显示12小时制时间,格式为“HH:MM:SS”
\A 显示24小时制时间,格式为“HH:MM”
\u 显示当前用户名
\w 显示当前所在目录的最后一个目录
\W 显示当前所在目录的完整名称
\# 执行的第几个命令
\$ 提示符,如果是root会提示“#”,如果是普通用户会提示“$”

在这里插入图片描述我们做以下测试:

PS1='[设定@设定@设定 设定]$ ' # 设定最后不要忘记加一个空格

在这里插入图片描述
这种修改只是临时修改,重启就会修改回来了。

6. 位置参数变量

位置参数变量是固定的,变量名称也是固定的,在linux中有以下位置参数变量:

位置参数变量 作用
$0 n为数字,$0代表你执行的命令本身,$1-$9代表第一个到第九个参数,十个以上的参数要用大括号包含,${10}
$* 这个变量代表命令行中的所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中的所有的参数,$@把每个参数看成一个整体
$# 这个变量代表命令行中的所有参数的个数

其实位置参数变量对我们来说,只有脚本的建立者知道,在后面要跟几个参数,否则位置参数变量其实是不好用的。

建议用其他方式来接收脚本后的参数。

6.1 $n

$n主要是为了接收用户向程序中传递的值。测试如下:

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第10张图片
自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第11张图片
这就是位置参数变量的作用。通过人为的写入参数,向脚本中传递需要的数值

写一个数值加法器:

#!/bin/bash

num1=$1
num2=$2
sum=$(($num1+$num2)) # 变量sum的值是num1+num2
echo $sum # 打印变量sum的值

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第12张图片
这个脚本只有脚本的编写者才知道要跟两个数字,如果没有输入数值就要报错。

6.2 $* $@ $#

三者的区别是:

  • $* 将所有的参数当作一个整体=
  • $@把每个参数看成一个整体
  • 所有参数的个数

我们用一个例子来反映这几个变量的区别:

#!/bin/bash

echo "A total of $# parameters"  # 所有参数个数
echo "The parameters is : $*" # 代表所有参数
echo "The parameters is : $@" # 代表所有参数

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第13张图片
这个测试还不能看到$*与$@的区别,我们使用以下脚本进行区别:

#!/bin/bash
for i in "$*" # $*中的所有参数看成是一个整体,所以这个for循环只会循环一次
	do
		echo "The parameters is : $i"
	done
x=1
for y in "$@" # $@ 中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
	do
		echo "The parameter$x is : $y"
		x=$(($x+1)) # 每循环一次x加1
	done

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第14张图片
这样就可以解释三种的区别。

7.预定义变量

位置参数变量就是预定义变量中的一种,只是他的内容比较多有四个,所以单独拿出来。但是他其实和预定义变量是一样的。

预定义变量 作用
$? 判断上一个命令的返回状态。如果$?的值是0,证明上一个命令正确执行;非0(具体哪个数,由命令自己来决定),代表上一个命令执行不正确
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号

7.1 $?

判断命令是否正确执行的一个变量。
自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第15张图片这里返回的127是系统规定,当输入命令找不到,就返回127

在这里插入图片描述这些都是系统事先规定好的

之前我们使用的&& ||是如何判断前一条命令是否正确执行的,就是靠$?来判断的

7.2 $$ $!

他们都是用来查看进程的PID的:

  • $$查看当前进程的PID
  • $!查看后台的最后一个进程的进程号

通过一个脚本进行测试:

#!/bin/bash

echo "The current process is $$" # 查看当前的PID,就是这个脚本的PID
find /root -name hello.sh & # &用来打入后台
echo "The last one Daemon process is $!" # 输出后台最后的PID,就是find命令的PID

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第16张图片
这就是两者的区别以及作用。

8. 接收键盘输入read

之前的位置参数变量接收参数时,发现必须要编写脚本的人才知道,脚本后面要跟几个参数,才能正确执行脚本。所以我们再次换为使用read来改变这种接收方式。

read [选项] [变量名]
选项:
-p:“提示信息”,在等待read输入时,输出提示信息
-t:read会一直等待用户,指定此选项可以设定等待时间
-n:read只接受指定的字符数,就会执行(不用回车)
-s:隐藏输入的数据,适用于机密信息的输入

我们使用一个脚本来解释测试这个命令:

#!/bin/bash

read -t 30 -p "please input your name:" name # 提示输入姓名,等待30秒
# 将输入的值给变量name
echo "Name is $name"
read -s -t 30 -p "Please enter your age:" age # 输入不回显,输入值给age
echo -e "\n"
echo "Age is $age"
read -n 1 -t 30 -p "Please select your gender[M/F]:" gender 
# 只能输入一个字符,输入值给gender
echo -e "\n"
echo "Sex is $gender"

自动化运维[shell编程]——————变量、用户自定义变量、环境变量、位置参数变量、预定义变量、read_第17张图片
这样就完全可以替代位置参数变量$n(n>0),还可以灵活的变动设定输入。

你可能感兴趣的:(shell)