跳转至

shell的变量

Linux 系统中 shell 变量的使用

简介

变量是 shell 中用来存储数据的一种特殊标识符。变量可以用来保存用户输入的值,也可以用来保存计算结果。

变量分类

shell 中的变量可以分为以下几类:

  • 用户自定义变量:由用户自己定义、修改、使用。
  • 环境变量:由系统维护,用于存储有关系统和用户的信息。
  • 位置参数变量:通过命令行给程序传递执行参数。
  • 内部参数变量:是 bash 预定义的特殊变量,用户不能修改。

变量赋值

变量赋值的格式如下:

Text Only
变量名=值

例如:

Text Only
name="Josh"

变量命名

变量名的命名规则如下:

  • 变量名只能由字母、数字、下划线组成。
  • 变量名不能以数字开头。
  • 变量名不能是关键字和特殊字符。

变量引用

变量引用的格式如下:

Text Only
$变量名

例如:

Text Only
echo $name

输出:

Text Only
Josh

变量清除

变量清除的格式如下:

Text Only
unset 变量名

例如:

Text Only
unset name

变量只读

变量设置为只读的格式如下:

Text Only
readonly 变量名

例如:

Text Only
readonly name

内部参数变量

shell 内部参数变量是一组特殊的变量,它们由 shell 自动设置和维护,用于存储有关 shell 和正在运行的命令的信息。

以下是一些常见的 shell 内部参数变量及其用途:

变量名 含义
$0 保存当前脚本或命令的名称。
$1, $2, $3, ... 保存传递给脚本或函数的位置参数。
$# 保存传递给脚本或函数的位置参数的数量。
$@ 保存所有传递给脚本或函数的位置参数的列表。
$* 保存所有传递给脚本或函数的位置参数的列表,作为一个单独的字符串。
$$ 保存当前 shell 进程的进程 ID(PID)。
$? 保存上一个命令的退出状态(返回值)。通常,0 表示成功,非零值表示出现了错误。
$! 保存在后台运行的最后一个命令的 PID。
$_ $ 表示在此之前执行的命令或脚本的最后一个参数 \

示例:

Text Only
#!/bin/bash
echo "这个脚本的名字是: $0"
echo "参数一共有: $#"
echo "参数的列表是: $@"
echo "参数的列表是: $*"
echo "第一个位置参数是: $1"
echo "第二个位置参数是: $2"
echo "第三个位置参数是: $3"

执行结果:

Text Only
[root@localhost shell]# sh 1.sh 1 2 3 4 5 6
这个脚本的名字是: 1.sh
参数一共有: 6
参数的列表是: 1 2 3 4 5 6
参数的列表是: 1 2 3 4 5 6
第一个位置参数是: 1
第二个位置参数是: 2
第三个位置参数是: 3
标题 Linux 系统中 shell 变量的使用
简介 变量是 shell 中用来存储数据的一种特殊标识符。变量可以用来保存用户输入的值,也可以用来保存计算结果。
分类 用户自定义变量、环境变量、位置参数变量、内部参数变量
赋值 变量名=值
命名 只能由字母、数字、下划线组成;不能以数字开头;不能是关键字和特殊字符
引用 $变量名
清除 unset 变量名
只读 readonly 变量名
内部参数变量 \(0、\)1、2、...、#、@、*、\(、?、\)!、$_
常见环境变量 PWD、PATH、USER、LOGNAME、SHELL、HOME
应用 保存用户输入的值、保存计算结果、传递参数给命令或脚本、控制命令或脚本的执行
退出返回状态 保存在变量 ?

通常,0 表示成功,非零值表示出现了错误。例如:

Text Only
[root@localhost ~]# echo "Hello, world!"
Hello, world!
[root@localhost ~]# echo $?
0

shell 命令的退出状态(返回值)保存在变量 ? 中。

  • 0 表示成功
  • 1 表示通用错误或执行失败
  • 126 表示命令或脚本没权限
  • 127 表示命令没找到

示例

Text Only
[root@localhost]# echo $$       #显示当前进程的pid
2163
[root@localhost]# echo $?       #显示上一条命令的返回值
0
[root@localhost ]# bash         #调用子shell
[root@localhost]# echo $$
4539
[root@localhost]# exit 1        #指定返回值并返回父shell
exit
[root@localhost]# echo $?   
1

[root@localhost]# display       #执行不存在的命令
-bash: display: 未找到命令
[root@localhost]# echo $?       #查看返回值
127
[root@localhost]# touch test.sh 
[root@localhost]# ./test.sh #执行不具权限的命令
-bash: ./test.sh: 权限不够
[root@localhost]# echo $?       #查看返回值
126

结论:退出返回状态可以用于判断命令的执行结果。

环境变量

环境变量是保存在系统内存中的数据,可以被所有程序访问。环境变量可以用于存储各种信息,例如当前工作目录、可执行程序的搜索路径、用户的名称等。

常见环境变量

变量名 含义
PWD 保存当前工作目录。
PATH 保存可执行程序的搜索路径。
USER 保存当前用户的名称。
LOGNAME 保存当前用户的登录名。
SHELL 保存当前 shell 的类型。
HOME 保存当前用户的主目录。

使用

环境变量可以通过 echo 命令来查看:

Bash

Text Only
echo $PWD

输出:

Text Only
/home/user

环境变量也可以在命令行中使用,例如:

Bash

Text Only
cd $HOME

这条命令将切换到当前用户的主目录。

补充

除了上述常见环境变量之外,还有一些其他的环境变量,例如:

变量名 含义
HISTSIZE 保存历史命令的数量。
HISTFILESIZE 保存历史命令的文件大小。
LANG 保存系统语言环境。
LC_ALL 保存系统的区域设置。
TERM 保存终端类型。
EDITOR 保存默认编辑器。

这些环境变量可以用于控制 shell 的行为或提供给程序使用。

数组

shell 中的数组是一种特殊的变量,可以保存多个值。数组的元素可以是任何数据类型,包括字符串、数字、布尔值等。

数组的定义格式如下:

Text Only
变量名=(元素1 元素2 ... 元素n)

1、例如,定义一个名为 numbers 的数组,其中包含 1、2、3 三个元素:

Text Only
numbers=(1 2 3)

数组的元素可以通过索引来访问。索引从 0 开始,例如:

Text Only
echo ${numbers[0]}

输出:

Text Only
1

读取全部元素:

Text Only
echo ${numbers[@]}

输出

Text Only
1 2 3

也可以使用 for 循环来遍历数组:

Text Only
for i in "${numbers[@]}"
do
    echo "$i"
done

输出:

Text Only
1
2
3

实验示例

Text Only
# 定义一个名为 `fruits` 的数组,其中包含 "apple"、"banana"、"orange" 三个元素
fruits=(apple banana orange)

# 遍历数组
for fruit in "${fruits[@]}"
do
    echo "$fruit"
done

# 获取数组的长度
echo ${#fruits[@]}

输出:

Text Only
apple
banana
orange
3

shell 数组可以用于存储多个值,可以用于各种场景。掌握 shell 数组的使用方法,可以帮助我们更好地使用 shell。