SHELL之变量

一、脚本
1、shell组成

#!脚本声明(使用哪种解释器)
#  注释信息
脚本内容

注意: 如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用:

#!/bin/env 解释器 
#!/bin/env bash

2、执行脚本方式

sh  -x  脚本文件路径
source  脚本文件路径
.       脚本文件绝对路径

二、变量
1、什么是变量

在 Shell 编程中,变量是用于存储数据值的名称。

  • 变量:内存空间,命名的内存空间
  • 内存:编址的存储单元
  • 进程:程序执行起来成为进程,进程的数据存储在内存当中,进程执行过程中需要临时存储数据需要变量。
eg:
1、计算机计算1+100
在内存中分出100个空间存储100个整数,让运算器挨个取它加起来。
2、计算机计算1+100万
对一个内存空间设为变量,它会一直变化。

2、引用变量值

$变量名

3、查看变量名

echo $变量名
echo ${变量名}

4、取消变量名

unset 变量名

5、变量的类型
按存储类型:决定数据存储的格式和长度。

  • 整数型
  • 浮点型
  • 字符型
  • 双精度浮点型
  • 数组

按使用类型:

  • 环境变量:变量名通常都大小写,由系统维护,用来设置工作环境,只有个别变量用户可以直接更改
  • 位置变量:bash内置,存储执行脚本时提供的参数
  • 预定义变量:bash内置,一类有特殊用途的变量,可直接调用,但不能直接赋值或修改
  • 自定义变量(本地变量):由用户自主设置、修改及使用

1、字符串变量

在 Shell中,变量通常被视为字符串。

你可以使用单引号 ' 或双引号 " 来定义字符串,例如:

my_string='Hello, World!'
或者
my_string="Hello, World!"

2、整数变量:

在一些Shell中,你可以使用 declare 或 typeset 命令来声明整数变量。

这样的变量只包含整数值,例如:

declare -i my_integer=42

3、数组变量

Shell 也支持数组,允许你在一个变量中存储多个值。

数组可以是整数索引数组或关联数组,以下是一个简单的整数索引数组的例子:

my_array=(1 2 3 4 5)
或者关联数组:

declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30

三、变量详解

1、环境变量
1)按生效的范围分类。

  • 系统环境变量:公共的,对全部的用户都生效。
  • 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

2)按生存周期分类。

  • 永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
  • 临时环境变量:使用时在Shell中临时定义,退出Shell后失效。

永久生效:

配置文件:/etc/profile、 ~/.bash_profile

相关操作:

env:列出当前用户所有的环境变量
set:列出当前用户所有变量
export:变量名=变量值 或者 变量名=变量值;export 变量名

常见的环境变量:

PWD、PATH、USER、LOGNAME、UID、SHELL、HOME、PS1、PS2、…

# AAA=NIHAO
# env | grep AAA
# export AAA
# env | grep AAA
AAA=NIHAO

2、系统变量
系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用。

内置变量 含义
$? 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误
$0 当前执行的程序或脚本名 (./02.sh)
$# 脚本后面接的参数的个数 3个
$* 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 (参数数组a b c)
$@ 脚本后面所有参数,参数是独立的,也是全部输出 (参数数组a b c)
$1~$9 脚本后面的位置参数,$1表示第1个位置参数,依次类推
${10}~$ 位置变量,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来)
$$ 当前所在进程的进程号,如echo $$
$! 后台运行的最后一个进程号 测试: sleep 400 &(后台运行)/sleep 400(ctrl+z 暂停运行), 再运行jobs, 查看当前进程的后台子进程.
!$ 调用最后一条命令历史中的参数
# cat variable.sh
#!/bin/bash
echo "列出脚本系统变量"
echo "\$0 = $0"    # "\" 是转译的意思,是字符串
echo "\$# = $#"
echo "\$* = $*"
echo "\$@ = $@"
echo "\$3 = $3"
echo "\$10 = ${10}"

3、自定义变量
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。

[root@scp1 ~]# A=hello
[root@scp1 ~]# ps
  PID TTY          TIME CMD
78656 pts/0    00:00:00 bash
78793 pts/0    00:00:00 ps
[root@scp1 ~]# echo $A
hello
[root@scp1 ~]# su user1
[user1@scp1 root]$ ps
  PID TTY          TIME CMD
78885 pts/0    00:00:00 bash
78917 pts/0    00:00:00 ps
[user1@scp1 root]$ echo $A

4、全局变量
全局变量:全局所有的用户和程序都能调用(文件配置),且继承,新建的用户也默认能调用。
解读相关配置文件

文件名 说明 备注
$HOME/.bashrc 当前用户的bash信息,用户登录时读取 定义别名、umask、函数等 $HOME:用户的家目录
$HOME/.bash_profile 当前用户的环境变量,用户登录时读取
$HOME/.bash_logout 当前用户退出当前shell时最后读取 定义用户退出时执行的程序等
/etc/bashrc 全局的bash信息,所有用户都生效
/etc/profile 全局环境变量信息 系统和所有用户都生效
$HOME/.bash_history 用户的历史命令 history -w 保存历史记录 history -c 清空历史记录

说明:以上文件修改后,都需要重新source让其生效或者退出重新登录。

用户登录系统后, 读取相关文件的顺序

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • /etc/bashrc
  • $HOME/.bash_logout

5、read

通过read可以从键盘接收内容使其赋值到指定变量上
格式为:read [-p "提示信息"] 变量名

  • -t 可以指定超时时间
  • -s 可以指定是否在shell里显示输入的内容(在设定密码之类的内容时候用)

四、变量值及范围控制

1、三种定界符

符号 含义
单引号' ' 禁止扩展 比如$变量视为普通字符
双引号" " 允许扩展 比如$变量会进行替换
反引号`` 执行反引号内的命令 并将结果返回 等同于$(命令)

单引号字符串的限制

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
注意:$()与 ` ` 等效,但$()更方便嵌套使用

2、变量的作用范围

局部变量:

  • 新定义的变量默认只在当前shell环境中有效
  • 无法在子shell环境中使用

全局变量:

  • 全局变量在当前shell及子shell环境中均有效
  • 使用export可将局部变量声明为全局变量
  • export 局部变量名 :为局部变量添加全局属性
  • export -n 全局变量名 : 取消指定变量的全局属性

五、交互式定义变量

read 标准输入取值(用户自己输入变量值)

目的:read从键盘读入变量值完成赋值
语法:read 选项 变量名

选项 释义
-p 提示用户的信息
-n 限制变量值的长度
-s 不显示用户输入的内容
-t 限制用户输入变量值的超时时间

六、定义变量的类型
declare 选项 变量名=变量值

选项 释义 举例
-i 将变量看成整数 declare -i A=123
-r 定义只读变量 declare -r B=HELLO
-a 定义普通数组
-A 定义关联数组
-x 将变量通过环境导出 declare -x C=666 export C=666

扩展:只读变量

[root@scp1 ~]# name=libai
[root@scp1 ~]# echo $name
libai
[root@scp1 ~]# readonly name
[root@scp1 ~]# echo $name
libai
[root@scp1 ~]# name=lili
-bash: name: 只读变量
posted @ 2024-08-20 09:09  *一炁化三清*  阅读(7)  评论(0编辑  收藏  举报