Shell 脚本中的变量(上)

简介: 1 变量概述变量即在程序运行过程中它的值是允许改变的量。变量是用一串固定的字符串去表示不固定的内容。变量表示命令的内存空间,将数据放在内存空间中,通过变量名引用,获取数据。

1 变量概述


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

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

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

变量的作用:

用来存放系统和用户需要使用的特定参数(值)。

  • 变量名:使用固定的名称,由系统预设或用户定义。
  • 变量值:能够根据用户设置、系统环境的变化而变化。

1.1 变量类型

变量赋值: 变量名=变量值(name=value)

bash变量类型:

1、根据变量的生效范围可分为:

  • 环境变量(全局变量):全局生效,在任何bash环境中都可以识别。
  • 局部变量:生效范围为当前shell进程。对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。
  • 本地变量:生效范围为当前shell进程中某代码片断,通常指函数。 只能在定义它们的函数/脚本内部中使用。

2、根据是否由系统定义可分为:

  • 内置变量:由系统维护,用于设置工作环境。如PS1,PATH,HISTSIZE, HOSTNAME,USER。
  • 自定义变量:由用户自己定义、修改和使用。

3、特殊变量:

  • 环境变量(全局变量):全局生效,在任何bash环境中都可以识别。:
  • 只读变量:read only, 只可以读取不可以更改 。
  • 位置变量: 通过命令行给脚本传递参数 。n(n是正整数),n(n是正整数),nn{10} 要加花括号。
  • 预定义变量:用来保持脚本程序的执行信息。
  • $0 :当前脚本名称(如果是软链接,显示当前软链接文件名)。
  • $? :查看上一次命令的执行状态,返回0为正常,非0为错误。
  • $* :返回所有参数,当整体返回。
  • $@ :返回所有参数,当个体返回。
  • $# :获取当前shell命令行中参数的总个数。
  • $_ :在此之前执行的命令或脚本的最后一个参数。
  • $$ :获取当前进程的PID。

1.2 变量的命名要求

  • 区分大小写
  • 不能使程序中的保留字和内置变量名称:如:if, for,hostname。
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反。
  • 使用英文时,尽量使用词义通俗易懂,如PATH。
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name


1.3 变量作用范围

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

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

方法:

  1. 法一,设置全局变量:
  • export name=value
  • 或 declare -x name=value
  1. 法二,将局部变量转变为全局变量:export name

示例:

步骤1、先设置一个局部变量color,使用bash命令进入子shell环境,查看变量是否有效;

步骤2、之后使用export命令将局部变量转换为环境变量,进入子shell环境,查看变量是否有效。

# 设置局部变量color
 [root@localhost ~]# color=red         //设置局部变量color
 [root@localhost ~]# echo $color
 red
 [root@localhost ~]# bash              //进入子shell环境
 [root@localhost ~]# echo $color       //查看变量color,为空,无效
 [root@localhost ~]# exit              //退出当前shell,返回上一级shell环境
 exit
 # 将局部变量color转换为全局变量
 [root@localhost ~]# export color     //将局部变量color转换为全局变量
 [root@localhost ~]# bash             //进入子shell环境
 [root@localhost ~]# echo $color      //查看变量color,有效
 red
复制代码


网络异常,图片无法展示
|


1.4 几个符号的作用

说明:

双引号" ":会把引号的内容当成整体来看待。强引用,识别变量,允许通过$符号引用其他变量值。
 单引号' ':会把引号的内容当成整体来看待。弱引用,禁止引用其他变量值,单引号内的内容都会被认为是普通字符。
 反撇号` ` 和 $() :调用命令执行后输出的结果。如果存在嵌套,不能使用反撇号。
 花括号{  } :定义变量范围。 echo ${color}${price}
复制代码


示例:

# 当引号内只表示字符串时,使用双引号或单引号都可以。
 [root@localhost ~]# echo "abc"
 abc
 [root@localhost ~]# echo 'abc'
 abc
 # 使用单引号或双引号时,引号内的内容会被当做一个整体。
 [root@localhost test]# touch a b     //创建a和b两个文件
 [root@localhost test]# ll
 总用量 0
 -rw-r--r--. 1 root root 0 4月   2 21:44 a
 -rw-r--r--. 1 root root 0 4月   2 21:44 b
 [root@localhost test]# touch "a b"       //创建名称为"a b"的一个文件
 [root@localhost test]# ll
 总用量 0
 -rw-r--r--. 1 root root 0 4月   2 21:44 a
 -rw-r--r--. 1 root root 0 4月   2 21:45 a b
 -rw-r--r--. 1 root root 0 4月   2 21:44 b
 # 双引号可以通过$符号引用变量值,单引号禁止引用变量值,单引号内的内容都被认为是普通字符。
 [root@localhost test]# echo "$HOME"
 /root
 [root@localhost test]# echo '$HOME'
 $HOME
 # 反撇号和$(),可以调用命令执行后输出的结果。
 [root@localhost ~]# pwd
 /root
 [root@localhost ~]# echo `pwd`
 /root
 [root@localhost ~]# echo $(pwd)
 /root
 # 如果存在嵌套,不能使用反撇号。可以使用$()。
 [root@localhost ~]# echo `echo `pwd``
 pwd
 [root@localhost ~]# echo $(echo `pwd`)
 /root
 [root@localhost ~]# echo $(echo $(pwd))
 /root
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


网络异常,图片无法展示
|


1.5 展开命令行

展开命令执行顺序:

把命令行拆分成单个命令词
 展开别名
 展开花括号的声明 {}
 展开波浪符声明 ~
 命令替换 $()和``
 再次把命令行拆分成命令词
 展开文件通配符*、?、[abc]等待
 准备I/O重定向 < 和 >
 运行命令
复制代码


2 局部变量


定义变量: 变量名=变量值

引用变量:$变量名${变量名}

查看变量:

  • echo $变量名:查看单个变量
  • set:查看所有变量,包括局部变量和环境变量

取消变量: unset 变量名

作用范围: 仅在当前shell环境中有效,无法在子shell环境中使用。


3 环境变量


3.1 系统内置环境变量

1、由系统提前创建,用来设置用户的工作环境。

2、使用env命令查看所有环境变量:

[root@localhost ~]# env    //查看所有环境变量,这里只截取部分进行展示
 XDG_SESSION_ID=1
 HOSTNAME=localhost.localdomain
 SELINUX_ROLE_REQUESTED=
 TERM=xterm
 SHELL=/bin/bash
 HISTSIZE=1000
 SSH_CLIENT=192.168.72.100 55445 22
 SELINUX_USE_CURRENT_RANGE=
 SSH_TTY=/dev/pts/0
 USER=root
复制代码


3、需要记住的常用环境变量:

  • $PATH 表示可执行文件的默认路径
  • $USER 表示用户名称
  • $HOME 表示用户的宿主目录
  • $LANG 表示语言和字符集
  • $PWD 表示当前所在工作目录
[root@localhost ~]# echo $PATH
 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
 [root@localhost ~]# echo $USER
 root
 [root@localhost ~]# echo $HOME
 /root
 [root@localhost ~]# echo $LANG
 zh_CN.UTF-8
 [root@localhost ~]# echo $PWD
 /root
复制代码


4、环境变量的特性:

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


3.2 环境变量的配置文件

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

全局配置文件:

  • /etc/profile,修改此文件会作用于所有用户。

用户独立的配置文件:

  • ~/.bash_profile,修改这个文件只作用于当前用户。

示例:

1)将脚本文件所在目录添加进可执行文件的默认路径PATH中,则可直接通过文件名称执行该程序。

[root@localhost ~]# echo "echo 'hello stars'" > /data/hello.sh  //写一个脚本
 [root@localhost ~]# cat /data/hello.sh
 echo 'hello stars'
 [root@localhost ~]# chmod a+x /data/hello.sh     //为脚本增加执行权限
 [root@localhost ~]# vim /etc/profile            //编辑全局配置文件
 ---------------------------
 export PATH=$PATH:/data       //将/data加入变量PATH中
 [root@localhost ~]# source /etc/profile    //刷新文件,使立即生效
 [root@localhost data]# echo $PATH
 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data
 [root@localhost ~]# hello.sh    //现在可直接使用文件名执行该脚本
 hello stars
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|




2)在当前用户环境中,添加系统的空闲等待时间TMOUT,等待15分钟后自动登出。

[root@localhost ~]# echo $TMOUT              //查看TMOUT,没有该变量
 [root@localhost ~]# vim ~/.bash_profile     //编辑用户的配置文件,加入变量TMOUT
 ----------------------
 TMOUT=900       //超时900秒后自动注销   
 [root@localhost ~]# source ~/.bash_profile    //刷新文件,使立即生效
 [root@localhost ~]# echo $TMOUT               //查看变量TMOUT,显示为900
 900
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


4 只读变量


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

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

定义变量:

  • 第一步:name=value # 定义一个变量
  • 第二步:readonly name # 使用 readonly 来修饰该变量 ,表明只读
[root@localhost data]# year=2022       //定义一个变量year         
 [root@localhost data]# readonly year   //使用 readonly 修饰该变量 ,表明只读
 [root@localhost data]# echo $year
 2022
 [root@localhost data]# year=2000      //无法重新赋值
 -bash: year: 只读变量
 [root@localhost data]# unset year     //无法使用unset删除
 -bash: unset: year: 无法反设定: 只读 variable
复制代码


网络异常,图片无法展示
|


相关文章
|
6天前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
30 1
|
26天前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
52 12
|
21天前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
24 2
|
29天前
|
Shell
shell脚本变量 $name ${name}啥区别
shell脚本变量 $name ${name}啥区别
|
1月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
87 2
|
15天前
|
存储 Java Shell
Shell 变量
10月更文挑战第2天
11 0
|
15天前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
12 0
|
1月前
|
Shell
Shell脚本有哪些基本语法?
【9月更文挑战第4天】
52 17
|
1月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
40 12
|
1月前
|
网络协议 关系型数据库 MySQL
Shell 脚本案例
Shell 脚本案例
41 8