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导出,可被子进程继承

创建环境变量的方法:

全局变量:系统的所有范围内生效的变量

复制代码
[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
相关推荐
A小辣椒2 小时前
TShark:基础知识
linux
AlfredZhao4 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao19 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux