RHCSE--SHELL02--变量

一、变量的基本操作:增删改查用

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`导出,可被子进程继承 **创建环境变量的方法:** ![](https://i-blog.csdnimg.cn/direct/5d33a6a06ed541d08ef392a3eae56967.png) **全局变量:系统的所有范围内生效的变量** [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程序都可以使用的变量,环境变量会影响所有的脚本的执行结 果。 ![](https://i-blog.csdnimg.cn/direct/e34a831815054de1b0df4b3eaaa8c2e6.png) ![](https://i-blog.csdnimg.cn/direct/3a45d053aade4f079f57241c318b9bd0.png) #!/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 变量默认都是字符串类型,进行数学运算需要特殊处理。 #### 算术运算 ![](https://i-blog.csdnimg.cn/direct/71eb3bed973d43f19e9b2fbbd49ec7f1.png) ###### 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" #### 字符串运算 ![](https://i-blog.csdnimg.cn/direct/1ce2802d72314f82a3bb3e2b9165b76e.png) [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 ![](https://i-blog.csdnimg.cn/direct/6a63f16c6c1746c892c3ac30b18c6d09.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

相关推荐
z_mazin1 小时前
逆向Sora 的 Web 接口包装成了标准的 OpenAI API 格式-系统架构
linux·运维·前端·爬虫·系统架构
8***84821 小时前
Nginx三种安装方式
运维·nginx
咖啡の猫1 小时前
Python分支结构
服务器·网络·python
XH-hui1 小时前
【打靶日记】群内靶机 Open
linux·网络安全
没有口袋啦1 小时前
《基于iptables的nginx的https的搭建》
linux·服务器·网络
凉、介1 小时前
Linux 下的 time_before/time_after 接口
linux·运维·服务器·学习
python百炼成钢1 小时前
42.Linux INPUT 子系统驱动
linux·驱动开发
dustcell.1 小时前
nginx的https搭建
运维·nginx·https