【Linux】全面讲解 Shell 变量的那些事

【Linux】全面讲解 Shell 变量的那些事

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!

专栏订阅入口

| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 |

往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

目录

一、基本介绍

1、Shell 的概念

2、变量的概念

二、变量的数据类型

1、字符串(String)

2、整数(Integer)

3、数组(Array)

4、只读变量(Readonly)

三、变量的作用类型

1、环境变量

2、本地变量

3、位置变量

四、变量的相关操作

1、查看变量

2、变量特殊赋值

3、变量中字符串操作

4、环境变量持久化

一、基本介绍

1、Shell 的概念

在 Linux 系统中,Shell 是用户与内核之间交互的接口程序,为用户提供使用操作系统的接口,也被称为命令解释器。Shell 接收用户输入的命令,并将其转换为 Linux 系统可以理解的操作,最终通过调用相应的程序来完成这些操作。

2、变量的概念

在 Linux Shell 中,变量通常用于存储全局数据、局部数据或临时数据。

变量的一般定义格式如下:

<变量名>=<变量值>

# 示例:var=123

定义变量时,需要注意以下几点:

等号(=)两边不能有空格,否则会出现 command not found 报错变量名区分大小写变量名中只能包含字母、数字、下划线,且不能以数字开头变量名中避免使用 Shell 关键字,如 if、then、for、do、done、while、case、function 等变量名中避免使用特殊符号和空格变量名中尽量使用大写字母表示常量变量值中如果包含空格,应当使用单引号 '' 或双引号 "" 将变量值括起来,作为字符串使用

二、变量的数据类型

1、字符串(String)

在 Linux Shell 中,字符串是最常用的数据类型,主要用于存储文本信息:

变量值可以包含字母、数字、特殊符号和空格变量值可以用单引号 ''、双引号 "" 或不加引号

如果没有特别的声明,所有 Shell 变量在赋值后,其对应的变量值都是以字符串的形式存储的,即使变量值看起来是数字,因此以下变量定义都是等价的:

var=123

var='123'

var="123"

2、整数(Integer)

在 Linux Shell 中,可以使用 declare -i 或 let 命令将变量声明为整数,变量值只能包含数字。

declare -i var=123

let var=123

3、数组(Array)

在 Linux Shell 中,可以使用 declare -a 命令将变量声明为数组。

declare -a var=(1 2 3)

🔔 其中 var[0]=1,var[1]=2,var[2]=3

4、只读变量(Readonly)

在 Linux Shell 中,可以使用 declare -r 命令或 readonly 命令将变量声明为只读。

只读变量一旦赋值后,其变量值将不能被改变,再次赋值会出现 readonly variable 提示。

declare -r var=123

readonly var=123

🔔 此时执行 var=aaa,会出现 var: readonly variable 提示

三、变量的作用类型

1、环境变量

环境变量也称为系统变量,是一种全局变量,在当前 Shell 以及所有子 Shell 中均可以全局使用。

Linux 系统内置的环境变量如下

PATH # 定义了系统搜索可执行文件的目录路径,多个目录通常用冒号 : 分隔

HOME # 用户的主目录

SHELL # 用户当前使用的 Shell 类型

USER # 当前登录用户的用户名

LOGNAME # 当前登录用户的用户名,与 USER 通常相同

HOSTNAME # 系统主机名

LANG # 设置系统的语言和字符编码

LC_ALL # 同时设置语言和区域设置的所有类别

TERM # 定义了终端类型,用于控制终端的外观和行为

PS1 # 定义了命令行提示符的格式

HISTSIZE # 定义了历史命令列表的大小

MAIL # 定义了邮件文件的路径,Shell 会检查这个文件是否有新邮件

PATH_INFO # 在 CGI 脚本中,包含了请求的路径信息

SERVER_NAME # 在 CGI 脚本中,包含了服务器的主机名

SERVER_ROOT # 在 CGI 脚本中,包含了服务器的根目录

PWD # 当前工作目录的完整路径

RANDOM # 每次读取时都会提供一个随机数

SECONDS # 自 Shell 启动以来经过的秒数

SHLVL # 当前 Shell 层级,每启动一个新的 Shell,这个值就会增加

UID # 当前用户的用户 ID

GID # 当前用户的主组 ID

-------------------------------------------------------------

$0:表示当前执行的 Shell 脚本名称

$*:表示所有传递给 Shell 脚本或函数的参数

$@:表示所有传递给 Shell 脚本或函数的参数

$$:当前 Shell 的进程号

$?:表示上一个命令的退出状态

$#:表示当前 Shell 脚本位置参数的个数

🔔 $* 与 $@ 的区别:

1)不加双引号的时候,将传递参数通过空格分隔后进行循环遍历,没有区别

2)加双引号的时候

a)$* 会将传递的参数作为一个字符串变量进行循环遍历

b)$@ 会将传递参数通过空格分隔后作为多个独立变量进行循环遍历

用户也可以通过 export 命令或 declare -x 命令声明自定义的环境变量

export NGINX_HOME="/etc/nginx"

declare -x NGINX_HOME="/etc/nginx"

2、本地变量

本地变量是一种局部变量,只在当前 Shell 以及脚本函数中可以使用,子 Shell 无法获取。

var=123

或在 Shell 脚本的函数中

local var=123

3、位置变量

位置变量通常用于为 Shell 脚本或函数传递所需的参数。

$1:表示传递给 Shell 脚本或函数的第 1 个参数

$2:表示传递给 Shell 脚本或函数的第 2 个参数

...

以此类推

四、变量的相关操作

1、查看变量

# 查看变量值

echo $var

echo ${var} # 推荐方式

echo "${var}" # 推荐方式,如果包含空格不容易出现异常

# 查看所有变量

env # 查看所有环境变量

export # 查看所有环境变量,还可以显示环境变量的定义命令

set # 查看所有环境变量和自定义变量

🔔 env、export、set 比较:

# env 命令用于查看环境变量,或在执行命令时临时设置环境变量

# export 命令用于将 Shell 变量设置为环境变量,使其在子进程中可用

# set 命令用于查看和设置 Shell 变量,以及修改 Shell 的行为

2、特殊赋值

可以将一个变量的值赋给另一个变量

var1=123

var2=$var1

可以将 Shell 命令的执行结果赋值给一个变量

var=$(pwd)

3、变量值操作

# 替换字符串

${var/old/new} # 替换一个匹配的字符串

${var//old/new} # 替换全部匹配的字符串

# 删除字符串

${var/old} # 删除一个匹配的字符串

${var//old} # 删除全部匹配的字符串

# 变量赋值

${var:=value} # 设定默认值

${var:+value} # 临时赋值值

${var:-value} # 不赋值,仅打印

# 变换字符串

${var^} # 首字符大写

${var^^} # 所有字符大写

${var,} # 首字符小写

${var,,} # 所有字符小写

# 统计字符串长度

${#var}

# 样式匹配

${var#样式} # 从前向后删除,匹配最短样式

${var##样式} # 从前向后删除,匹配最长样式

${var%样式} # 从后向前删除,匹配最短样式

${var%%样式} # 从后向前删除,匹配最长样式

🔔 示例

tmp='hostname_192.168.0.1#031a2caf-cf56-44fa-af7a-6a4ab00456b3'

echo ${tmp#*#} 结果为:031a2caf-cf56-44fa-af7a-6a4ab00456b3

echo ${tmp%_*} 结果为:hostname

4、永久环境变量

直接在 Shell 中执行 export 命令自定义的环境变量,仅对当前用户、当前 Shell 生效,如果需要永久生效,需要修改配置文件。

# 方式一

# 在 ~/.bashrc 或 ~/.bash_profile 中添加

export NGINX_HOME="/etc/nginx"

🔔 仅对当前用户永久有效,需要重新打开 Shell 会话 或 执行 source 命令生效

# 方式二

# 在 /etc/bashrc 或 /etc/profile 或 /etc/environment 中添加

export NGINX_HOME="/etc/nginx"

🔔 对所有用户永久有效,需要重新打开 Shell 会话 或 执行 source 命令生效

相关内容

手指粗短如何变细长
手游365

手指粗短如何变细长

⌚ 06-29 👁️‍🗨️ 9912
骏鹰 (Hippogryph) - [IAF]冰火传说 (Ice and Fire) - MC百科
手游365

骏鹰 (Hippogryph) - [IAF]冰火传说 (Ice and Fire) - MC百科

⌚ 06-29 👁️‍🗨️ 1701
[交流]新区一般多久能合区啊?
365bet登录

[交流]新区一般多久能合区啊?

⌚ 06-27 👁️‍🗨️ 542

友情链接