一、什么是变量
很多人可能会说,可以变化的量就是变量。但是发现很多汉语意思很强大,你看的懂的字,却不一定可以理解它的意思。这里你可以理解为 a = 1,同时还可以 a =2、a = 3 ,不同的值都可以复制给同一个 变量 a 。
二、常见变量
Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量,Shell变量名在定义时,首个字符必须为字母(a-z,A-Z),不能以数字开头,中间不能有空格,可以使用下划线(_),不能使用(-),也不能使用标点符号等。
1、系统变量
Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用。这些变量在编写Shell脚本时非常重要,可以帮助我们获取脚本执行时的各种信息。系统变量详解如下:
序号 | 变量名 | 变量详解 | 示范 |
---|---|---|---|
1 | $0 | 当前正在执行的脚本或Shell程序的名称. | 如果脚本名为test.sh,则$0的值就是test.sh |
2 | $n | 当前脚本的第n个参数(n=1,2,…9)$1表示第一个参数,$2表示第二个参数,依此类推,超过9个参数需要使用${10}这样的形式来引用 | 执行./test.sh arg1 arg2时,$1就是arg1,$2就是arg2 |
3 | $* | 当前脚本的所有参数(不包括程序本身),将所有参数作为一个整体字符串返回 | 执行./test.sh a b c时,$*等于"a b c" |
4 | $# | 当前脚本的参数个数(不包括程序本身),常用于判断用户是否提供了足够的参数 | 执行./test.sh a b c时,$#的值为3 |
5 | $? | 上一条命令或程序执行后的状态返回值,返回0表示执行成功,非0表示执行失败(常用于检查命令执行结果) | ls /tmp执行后,echo $?会显示0(成功)或非0(失败) |
6 | $$ | 当前Shell进程的PID号,常用于创建临时文件时保证文件名唯一性 | tempfile_$$.txt会生成类似tempfile_1234.txt的唯一文件名 |
7 | $! | 获取后台运行的最后一个进程的PID号(进程ID) | 执行:sleep 5 & echo "后台进程PID: ! " , !", !",!等于12085 |
8 | $- | 显示当前Shell的选项标志集合(即通过set命令启用的选项) | 执行echo "当前Shell选项: − " , -", −",-等于himBHS |
9 | $_ | 获取上一个命令的最后一个参数或交互式Shell中最后执行的命令 | 执行mkdir test && cd , _ , ,_ 等于进入test目录 |
这些系统变量在Shell脚本编程中经常用于:
⊙ 参数检查和验证
⊙ 流程控制判断
⊙ 错误处理
⊙ 进程管理
⊙ 临时文件命名等场景
掌握这些系统变量的使用,可以大大提高Shell脚本的灵活性和健壮性。
2、环境变量
环境变量是Shell中非常重要的一类变量,主要用于在程序运行时设置各种系统参数和配置。下面详细介绍常见的Shell环境变量及其用途:
2.1、基本环境变量
1、PATH
定义了系统查找命令的路径列表,以冒号(:)分隔。当输入命令时,系统会按照PATH中的路径顺序依次查找可执行文件。
示例:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
2、HOME
表示当前用户的家目录路径。
示例:/home/username 或 /Users/username(MacOS)
3、SHELL
显示当前使用的Shell程序路径。
示例:/bin/bash、/bin/zsh
4、USER
显示当前登录用户的用户名。
示例:root、john
5、UID
显示当前用户的数字ID。
示例:0(root用户)、1001(普通用户)
2.2、系统信息变量
6、PWD
显示当前工作目录的完整路径。
示例:/var/www/html
7、TERM
指定当前终端类型,影响终端显示行为。
示例:xterm-256color、screen
8、HOSTNAME
显示当前主机名。
示例:server1.example.com
2.3、Shell配置变量
9、PS1
定义主命令提示符的格式,可以包含颜色、主机名、路径等信息。
示例:\u@\h:\w\$ 会显示为 user@host:~/dir$
10、HISTSIZE
设置Shell历史命令记录的数量上限。
相关变量:
HISTFILESIZE:历史文件中的最大命令数
HISTTIMEFORMAT:为历史命令添加时间戳
11、HISTTIMEFORMAT
设置历史命令显示的时间格式。
示例:%F %T 会显示为 2023-05-01 14:30:15
2.4、特殊用途变量
12、RANDOM
每次引用时都会随机生成一个0到32767之间的整数。
应用场景:生成临时文件名、随机密码等。
13、LANG/LC_*
设置语言环境,影响程序的语言和区域设置。
示例:LANG=en_US.UTF-8
14、EDITOR
定义默认文本编辑器,被许多程序使用。
示例:vim、nano
15、TZ
设置时区信息。
示例:Asia/Shanghai、America/New_York
这些环境变量可以通过export命令设置和导出,使其对子进程可见。要查看所有环境变量,可以使用env或printenv命令。
3、用户自定义变量详解
3.1、 变量定义与声明
在Shell脚本中,变量是存储数据的容器,用户可以根据需要定义自己的变量。自定义变量允许开发者在脚本中存储和操作数据,使脚本更加灵活和可重用。
3.1.1、变量命名规范
⊙ 变量名由含字母、数字和下划线(首字符不能以数字开头)
⊙ 变量名区分大小写(如Var与var不同)
⊙ 变量名禁止使用空格或特殊字符(如+、-、*等)
⊙ 变量名避免使用Shell关键字作为变量名(如if、for等
⊙ 变量名和等号之间不能有空格
3.1.2、变量定义
直接使用 “变量名=值格式” ,等号两侧不能有空格
语法:variable_name=value
示例:USER_NAME="JohnDoe" 或 PI=3.14159
3.1.3、变量引用
要使用已定义的变量,需要在变量名前加上$符号
echo $USER_NAME
echo "The value of PI is $PI"
3.2、变量类型
3.2.1、字符串变量
GREETING="Hello, World!"
FILE_PATH="/home/user/documents/report.txt"
3.2.2、数值变量
COUNT=10
TEMPERATURE=25.5
3.2.3、数组变量
FRUITS=("apple" "banana" "orange")
DAYS=(Monday Tuesday Wednesday Thursday Friday)
3.3、变量操作
3.3.1、变量拼接
FIRST_NAME="John"
LAST_NAME="Doe"
FULL_NAME="$FIRST_NAME $LAST_NAME"
echo $FULL_NAME
------------运行结果如下------------
John Doe
3.3.2、命令替换
CURRENT_DATE=`date`
# 或者更现代的写法
CURRENT_DATE=$(date)
3.3.3、变量默认值设置
# 如果VAR未设置,则使用default_value
echo ${VAR:-default_value}
3.4、变量作用域
3.4.1、局部变量
默认情况下,定义的变量只在当前Shell中有效
function demo() {
local LOCAL_VAR="I'm local"
echo $LOCAL_VAR
}
3.4.2、环境变量
要使变量在子进程中可用,需使用export
export DB_HOST="localhost"
3.5、特殊变量修饰符
3.5.1、字符串长度
STR="Hello"
echo ${#STR}
------------运行结果如下------------
5
3.5.2、字符串切片
STR="HelloWorld"
echo ${STR:0:5}
------------运行结果如下------------
Hello
```#### 5.3、变量内容替换
```bash
PATH="/usr/local/bin:/usr/bin:/bin"
echo ${PATH//:/,}
------------运行结果如下------------
/usr/local/bin,/usr/bin,/bin
三、典型案例
案例1、数组
fruits=("Apple" "Banana" "Orange")
echo "First fruit: ${fruits[0]}"
echo "All fruits: ${fruits[@]}"
------------运行结果如下------------
First fruit: Apple
All fruits: Apple Banana Orange
案例2、户交互输入
read -p "Enter your age: " age
if [ $age -ge 18 ]; then
echo "Adult"
else
echo "Minor"
fi
------------运行结果如下------------
输入的数字>=18时输出:Adult,否则输出:Minor
案例3、数据库备份
#!/bin/bash
# 配置变量
DB_USER="admin"
DB_PASS="securepassword"
DB_NAME="inventory"
BACKUP_DIR="/var/backups"
# 使用变量
echo "Starting database backup..."
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/$DB_NAME-$(date +%Y%m%d).sql
# 检查操作结果
if [ $? -eq 0 ]; then
echo "Backup completed successfully to $BACKUP_DIR"
else
echo "Backup failed" >&2
exit 1
fi
------------运行结果如下------------
如果备份成功输出:Backup completed successfully to /var/backups,否则输出:Backup failed