一、变量的基本操作:增删改查用
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