0%

读取变量

Shell 变量的读取与使用详解

在 Shell 脚本中,变量是存储和处理数据的基础。无论是系统环境变量还是用户自定义变量,掌握其读取和使用方式对编写高效脚本至关重要。本文将详细介绍 Shell 变量的读取方法、命令替换及交互式输入。

变量的基本赋值与读取

1. 变量赋值规则

  • 变量名与值之间用 = 连接,等号两边不能有空格(这是最容易出错的点)。
  • 变量名只能包含字母、数字和下划线,且不能以数字开头。
  • 若变量值包含空格或特殊字符,需用双引号(")包裹。
1
2
3
4
5
6
# 正确赋值(无空格)
name="Shell Script"
age=30

# 错误示例(等号两侧有空格)
# name = "Error" # 会被解析为命令,导致报错

2. 变量的读取方式

通过 $变量名${变量名} 读取变量值,两者的区别在于:

  • ${变量名} 用于明确变量边界,避免与后续字符混淆。
1
2
3
4
5
6
7
8
9
10
11
12
name="Tom"

# 基本读取
echo $name # 输出:Tom

# 变量后紧跟其他字符时,必须用${}
echo ${name}orrow # 输出:Tomorrow(正确解析为name变量 + "orrow")
echo $nameorrow # 输出空(Shell 会查找不存在的nameorrow变量)

# 变量拼接
greeting="Hello, $name"
echo $greeting # 输出:Hello, Tom

命令替换:将命令结果赋值给变量

通过 $(命令)命令 可以将命令的输出结果赋值给变量,这一过程称为命令替换

1. 语法格式

1
2
3
4
5
# 推荐使用 $(命令) 形式(可读性更好,支持嵌套)
变量名=$(命令)

# 兼容旧版本的 `命令` 形式(反引号)
变量名=`命令`

2. 示例

1
2
3
4
5
6
7
8
9
10
11
# 获取当前日期
today=$(date +%F)
echo "今天是:$today" # 输出:今天是:2025-08-06

# 统计文件行数
file_lines=$(wc -l /etc/passwd | awk '{print $1}')
echo "系统用户数:$file_lines" # 输出:系统用户数:40

# 嵌套命令替换(仅 $(...) 支持)
disk_usage=$(df -h | grep $(hostname) | awk '{print $5}')
echo "磁盘使用率:$disk_usage" # 输出:磁盘使用率:35%

交互式输入:read 命令

read 命令用于从键盘读取用户输入并赋值给变量,适合需要人机交互的脚本(如获取用户密码、配置参数等)。

1. 常用选项

选项 功能
-p "提示信息" 显示输入提示文字
-s 隐藏输入内容(用于密码等敏感信息)
-t 秒数 设置输入超时时间(超时后脚本继续执行)
-n 字符数 限制输入的字符数量(达到数量后自动结束输入)
-a 数组名 将输入的多个值存入数组

2. 示例

(1)基本用法
1
2
3
4
5
6
7
#!/bin/bash
# 文件名:get_info.sh

read -p "请输入您的姓名:" name
read -p "请输入您的年龄:" age

echo "您好,$name!您的年龄是 $age 岁。"

执行结果:

1
2
3
4
sh get_info.sh
请输入您的姓名:张三
请输入您的年龄:25
您好,张三!您的年龄是 25 岁。
(2)读取密码(隐藏输入)
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

read -p "请输入密码:" -s passwd
echo # 换行
read -p "请确认密码:" -s passwd2
echo

if [ "$passwd" = "$passwd2" ]; then
echo "密码设置成功!"
else
echo "两次密码不一致!"
fi
(3)超时输入与字符限制
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

echo "请在5秒内输入一个1-3位的数字:"
read -t 5 -n 3 num # 5秒超时,最多输入3个字符
echo

if [ -z "$num" ]; then # 判断变量是否为空
echo "输入超时或未输入!"
else
echo "您输入的是:$num"
fi

变量的作用范围

  1. 局部变量:默认情况下,变量仅在当前 Shell 进程中有效,脚本执行结束后失效。

  2. 环境变量:通过export命令可将变量提升为环境变量,供子进程使用:

    1
    2
    export PATH=$PATH:/new/dir  # 将新目录添加到系统路径
    export LANG=zh_CN.UTF-8 # 设置语言环境

欢迎关注我的其它发布渠道