一、变量的基本操作:增删改查用
1. 创建变量(增)
定义变量:
-
1.直接赋值:name="li si"
-
2.read命令: read name
-
3.使用位置参数(1 2 3...) : name=1
-
4.命令输入:name=$(whoami)
语法: 变量名=值
# 创建字符串变量
name="张三"
message="Hello World"
# 创建数字变量(Shell中所有变量本质上都是字符串)
age=25
count=100
# 创建带空格的变量(必须用引号)
full_name="Li Si"
file_path="/home/user/documents"
# 使用命令结果创建变量
current_time=$(date)
file_count=$(ls | wc -l)
注意事项:
-
值中有特殊字符或空格时,必须用引号
-
变量名只能包含字母、数字、下划线,且不能以数字开头
2. 读取变量(查)
查看单个变量的值::
语法: $变量名或 ${变量名}
-
echo $PATH -
echo ${PATH} -
printf "$PATH\n" -
printf "${PATH}\n"
基本读取
echo $name
echo "我的名字是: $name"
使用花括号明确边界(推荐)
echo "我的名字是: ${name}"
防止歧义的例子
file="document"
echo "这是${file}1.txt" # 正确:这是document1.txt
echo "这是$file1.txt" # 错误:尝试读取不存在的变量file1
查看所有变量:
set:查看所有的变量和函数
declare:查看所有的变量和函数
env:显示所有的全局变量
root@rhce \~# set | grep alice
_=alice
a=alice
root@rhce \~# declare | grep alice
_=alice
a=alice
root@rhce \~# env | grep alice
root@rhce \~#
3. 修改变量(改)
直接重新赋值:
name="张三"
echo "原名: $name"
name="李四"
echo "改名后: $name"
# 在原有值基础上修改
count=10
count=$((count + 5)) # 算术运算
echo "新的数量: $count"
path="/home/user"
path="${path}/documents"
echo "新路径: $path"
4. 删除变量(删)
使用 unset命令:
# 创建变量
temp_var="临时数据"
echo "删除前: $temp_var"
# 删除变量
unset temp_var
二、变量的生效范围
1. 局部变量(Local Variables)
定义:只在函数内部生效的变量
# 局部变量示例
var="全局变量"
demo_local() {
local local_var="我是局部变量"
echo "函数内部: local_var = $local_var"
# 没有local关键字也会创建局部变量(但这是危险的做法)
temp_var="临时变量" # 这实际上会创建全局变量
echo "$var"
}
demo_local
echo "========"
echo $local_var
echo "$var"
#测试:
[root@rhce ~]# bash /shell/jubu.sh
函数内部: local_var = 我是局部变量
全局变量
========
全局变量
局部变量:仅在一部分范围内生效的变量
[root@localhost ~]# vim .bash_profile # ~/.bash_profile 是用户独享的配置文件
# 在文件最后新增一行,修改完成后保存退出:
a=1000
[root@localhost ~]# echo $a
# 未更新变量文件时,a值未发生变化
kunpeng
[root@localhost ~]# source .bash_profile
# 更新变量文件后,a值发生变化
[root@localhost ~]# echo $a
1000
[root@localhost ~]# bash
# 打开一个新的 bash
[root@localhost ~]# echo $a
# a变量未定义
[root@localhost ~]# exit
# 退出新打开的 shell
[root@localhost ~]# su - root
# 以登录的方式切换用户,此时会自动读取.bash_profile 文件
[root@localhost ~]# echo $a
# a变量值生效
1000
[root@localhost ~]# bash
[root@localhost ~]# echo $hehe
[root@localhost ~]# exit
# 退出当前的登录 shell
当前用户生效的文件
~/.bashrc 和 ~/.bash_profile
所有用户生效的文件
/etc/bashrc , /etc/profile , /etc/profile.d/
文件加载的顺序:
[root@node13 ~]# su - student
Last login: Sun Sep 18 23:06:43 CST 2022 on pts/0
/etc/profile
/etc/profile.d/name3.sh
/etc/bashrc
/home/student/.bash_profile
/home/student/.bashrc
/etc/bashrc
[root@node13 ~]# su student
/home/student/.bashrc
/etc/bashrc
/etc/profile.d/name3.sh
2. 全局变量(Global Variables)
**定义:**在整个脚本中可见,但不传递给子进程
#!/bin/bash
# 全局变量定义
global_var="我是全局变量"
demo_global() {
echo "函数内部访问全局变量: $global_var"
# 修改全局变量
global_var="函数内修改了全局变量"
}
echo "函数调用前: $global_var"
demo_global
echo "函数调用后: $global_var"
3. 环境变量(Environment Variables)
定义: 对当前Shell及其所有子进程都有效
使用 export导出,可被子进程继承
创建环境变量的方法:

全局变量:系统的所有范围内生效的变量
[root@localhost ~]# vim /etc/profile
# /etc/profile 是系统的配置文件,所有用户共享
# 在文件最后新增一行,输入如下信息,并保存退出:
b=2000
[root@localhost ~]# echo $b
# 变量未更新
2020
[root@localhost ~]# source /etc/profile
# 更新变量
[root@localhost ~]# echo $b
2000
# 变量值发生了变化
[root@localhost ~]# bash
# 打开一个新的 bash
[root@localhost ~]# echo $b
# 变量未定义
[root@localhost ~]# exit
# 退出新打开的 shell
[root@localhost ~]# su - root
# 以登录的方式切换用户,此时会自动读取/etc/profile 文件
[root@localhost ~]# echo $b
# b 变量值生效
2000
[root@localhost ~]# useradd huawei
[root@localhost ~]# su - huawei
# 切换到该用户
[huawei@localhost ~]$ echo $b
2000
# 变量 b 生效
[huawei@localhost ~]$ exit
# 退出当前用户
logout
bash内置环境变量
shell程序在运行时,会接受一组变量来确定登录用户名、命令路径、终端类型、登录目录等等,这些变量就是
环境变量。shell内置的环境变量是所有的shell程序都可以使用的变量,环境变量会影响所有的脚本的执行结
果。


#!/bin/bash
echo "=====\$@======"
for i in "$@"
do
echo $i
done
echo "==========="
for i in "zhang san xixi" "wang wu"
do
echo $i
done
echo "=====\$*======"
for i in "$*"
do
echo $i
done
#测试
[root@rhce shell2]# bash /shell2/test6.sh hang san xixi wang wu
=====$@======
hang
san
xixi
wang
wu
===========
zhang san xixi
wang wu
=====$*======
hang san xixi wang wu
脚本:
[root@rhce shell]# cat /shell/name.sh
#!/bin/bash
#########################
#File name:/shell/name.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2025-11-20 19:19:57
#Description:
#########################
echo "当前脚本的名称是:$0"
echo "传入参数个数: $#"
echo "传入的第一个参数: $1"
echo "传入的第三个参数: $3"
echo "=======\$*=========="
echo "传入的所有参数:$*"
echo "=======\$@=========="
echo "传入的所有参数:$@"
echo "当前shell的PID : $$"
#测试:
[root@rhce shell]# bash /shell/name.sh hehe xixi haha lele "zhang san"
当前脚本的名称是:/shell/name.sh
传入参数个数: 5
传入的第一个参数: hehe
传入的第三个参数: haha
=======$*==========
传入的所有参数:hehe xixi haha lele zhang san
=======$@==========
传入的所有参数:hehe xixi haha lele zhang san
当前shell的PID : 1682
三、变量的运算
Shell 中的变量运算主要包括算术运算、字符串运算、逻辑运算等。由于 Shell 变量默认都是字符串类型,进行数学运算需要特殊处理。
算术运算

1. 基本算术运算符
#!/bin/bash
a=10
b=3
# 加法
sum=$((a + b))
echo "$a + $b = $sum" # 输出: 10 + 3 = 13
# 减法
diff=$((a - b))
echo "$a - $b = $diff" # 输出: 10 - 3 = 7
# 乘法
product=$((a * b))
echo "$a * $b = $product" # 输出: 10 * 3 = 30
# 除法(整数除法)
quotient=$((a / b))
echo "$a / $b = $quotient" # 输出: 10 / 3 = 3
# 取模(求余数)
remainder=$((a % b))
echo "$a % $b = $remainder" # 输出: 10 % 3 = 1
2. 算术运算的几种语法
方法一:$(( )) 算术扩展(推荐)
# 最常用的方法
result=$((10 + 5 * 2))
echo $result # 输出: 20
# 支持变量
x=15
y=4
echo $((x / y)) # 输出: 3
方法二:let 命令
# 使用let命令,不需要$
let "z = 5 + 3"
echo $z # 输出: 8
# 复合运算
let "z += 2" # z = z + 2
let "z *= 3" # z = z * 3
let "z++" # 自增
let "z--" # 自减
echo $z # 输出: 30
方法三:expr 命令
# 注意:运算符前后要有空格
result=$(expr 10 + 5)
echo $result # 输出: 15
# 乘法需要转义
result=$(expr 10 \* 2)
echo $result # 输出: 20
# 不支持浮点数
方法四:bc 命令(支持浮点数)
# 基本浮点运算
result=$(echo "scale=2; 10 / 3" | bc)
echo $result # 输出: 3.33
# 平方根
sqrt=$(echo "scale=2; sqrt(16)" | bc -l)
echo "√16 = $sqrt" # 输出: √16 = 4.00
3. 复合赋值运算
#!/bin/bash
count=10
# 各种复合赋值运算
((count += 5)) # count = 15
echo "+= 5: $count"
((count -= 3)) # count = 12
echo "-= 3: $count"
((count *= 2)) # count = 24
echo "*= 2: $count"
((count /= 4)) # count = 6
echo "/= 4: $count"
((count %= 5)) # count = 1
echo "%= 5: $count"
[root@rhce ~]# count=5
[root@rhce ~]# echo $((count++))
5
[root@rhce ~]# echo $count
6
[root@rhce ~]# echo $((count--))
6
[root@rhce ~]# echo $count
5
# 前置自增/自减
[root@rhce shell2]# count=5
[root@rhce shell2]# echo $((++count))
6
[root@rhce shell2]# echo $count
6
[root@rhce shell2]# echo $((--count))
5
[root@rhce shell2]# echo $count
5
实验
实验:计算用户输入的任意两个整数的和、差、乘积、商、余数。
方法1:
[root@localhost test4]# cat 1.sh
#!/bin/bash
a=$1
b=$2
echo a+b=$(($a+$b))
echo a-b=$((a-b))
echo a*b=$((a*b))
echo a/b=$((a/b))
echo a%b=$((a%b))
[root@localhost test4]# ./1.sh 10 3
a+b=13
a-b=7
a*b=30
a/b=3
a%b=1
方法2:
[root@localhost test4]# cat 1.1.sh
#!/bin/bash
read -p "please input two number:" a b
echo $a+$b=$(($a+$b))
echo $a-$b=$((a-b))
echo $a*$b=$((a*b))
echo $a/$b=$((a/b))
echo $a%$b=$((a%b))
[root@localhost test4]# ./1.1.sh
please input two number:3 4
3+4=7
3-4=-1
3*4=12
3/4=0
3%4=3
方法3:
read -p "please input 2 numbers: " a b
echo "`expr $a + $b`=$a+$b"
echo "`expr $a - $b`=$a-$b"
echo "`expr $a \* $b`=$a*$b"
echo "`expr $a / $b`=$a/$b"
echo "`expr $a % $b`=$a%$b"
字符串运算

[root@localhost ~]# str1="hello world"
#返回变量长度
[root@localhost ~]# echo ${#str1}
11
#变量截取
#指定起始位置,一直到结束
[root@localhost ~]# echo ${str1:1}
ello world
#指定长度,不指定起始位置默认从开头开始
[root@localhost ~]# echo ${str1::3}
hel
#指定起始位置和长度
[root@localhost ~]# echo ${str1:1:3}
ell
#从右边第几个字符开始,及字符的个数
[root@localhost ~]# echo ${str1:0-5:3}
d
#输出右边的几个字符
[root@localhost ~]# echo ${str1:0-5}
world
#获取后缀名tar.gz
[root@localhost ~]# filename=testfile.tar.gz
[root@localhost ~]# file=${filename#*.}
[root@localhost ~]# echo $file
tar.gz
#获取后缀名.gz
[root@localhost ~]# filename=testfile.tar.gz
[root@localhost ~]# file=${filename##*.}
[root@localhost ~]# echo $file
gz
#截取testfile.tar
[root@localhost ~]# filename=testfile.tar.gz
[root@localhost ~]# file=${filename%.*}
[root@localhost ~]# echo $file
testfile.tar
#截取testfile
[root@localhost ~]# filename=testfile.tar.gz
[root@localhost ~]# file=${filename%%.*}
[root@localhost ~]# echo $file
testfile
脚本1:删除文件扩展名
#!/bin/bash
file="$1"
echo "原文件名: $file"
echo "新文件名: ${file%.*}"
for filename in `ls /dir1`
do
# echo $filename
mv "/dir1/$filename" "/dir1/${filename%.*}"
echo "文件后缀已删除"
done
脚本2:从路径中提取文件名
#!/bin/bash
path="$1"
echo "完整路径: $path"
echo "纯文件名: ${path##*/}"
脚本3:更改文件扩展名
将目录/dir1下的文件后缀名改名为.png

#练习1:给指定目录下的所有普通文件加上.jpg的后缀名
[root@rhce shell2]# vim /shell2/add_jpg.sh
#!/bin/bash
read -p "please input a dir name:" f
for filename in $(find $f -type f )
do
echo $filename
mv "$filename" "${filename}.jpg"
echo "$filename 改名为 ${filename}.jpg"
# echo $filename
done
#练习2:给指定目录下的所有以jpg结尾的文件删除后缀名.jpg
[root@rhce shell2]# vim /shell2/remove_jpg.sh
#!/bin/bash
read -p "please input a dir name:" f
for filename in $(find $f -name "*.jpg")
do
mv "$filename" "${filename%.*}"
echo "$filename" 改名为 "${filename%.*}"
done
#练习3:修改指定目录下的以.jpg结尾的普通文件改为以.png结尾
[root@rhce shell2]# cat /shell2/jpg_to_png.sh
#!/bin/bash
read -p "please input a dir name:" f
for filename in $(find $f -name "*.jpg")
do
mv "$filename" "${filename%.*}.png"
echo "$filename" 改名为 "${filename%.*}.png"
done