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
相关推荐
夜雪一千37 分钟前
Python enumerate() 函数完整详解:遍历同时获取索引,告别手动计数
服务器·windows·python
donoot1 小时前
Linux系统下图书馆级电子书全自动标准化分类整理完整实施方案
大数据·linux·运维·电子书管理
ITKEY_2 小时前
macOS brew 安装的nginx 文件在哪里?
运维·nginx·macos
Felix-lxd2 小时前
Ubuntu 22.04 配置 Nginx
linux·nginx·ubuntu
Elastic 中国社区官方博客2 小时前
如何比较两个 Elasticsearch 索引并找出缺失的文档
大数据·运维·数据库·elasticsearch·搜索引擎
大E帝国子民13 小时前
MacOS 安装Seismic Unix
服务器·macos·unix
Tim_Van3 小时前
在 CentOS 7 中安装 Chromium 的完整步骤
linux·运维·chrome·centos
德福危险3 小时前
富有想象力的XSS盲打:靶机练习之Tempus_fugit5
服务器·网络·xss
2023自学中3 小时前
C++ 内存追踪器
linux·c++
孫治AllenSun4 小时前
【Nginx】配置参数和使用案例
运维·nginx