主题
  • 默认模式
  • 浅蓝色模式
  • 淡绿色模式
  • 深夜模式

Shell 变量

在 Shell 编程中,变量是用于存储数据值的名称。

✅ 在定义变量时,变量名无需添加美元符号 ($),这一点跟 PHP 语言中的变量不同。示例如下:

your_name="kaicz"

✅ 需注意,变量名和等号之间不能有空格——这一点可能与你熟悉的所有编程语言都不同。同时,变量名的命名必须遵循以下规则:

  • 变量名只能包含字母、数字和下划线 (_),且不能以数字开头。
  • 变量名区分大小写,不能包含空格。
  • 变量名不能是 Shell 的保留字(如 if、then、else、fi 等)。
  • 变量名不能包含特殊字符(如 !、@、#、$、% 等)。
  • 变量名的长度没有限制,但建议保持简短且具有描述性,以便于理解其用途。
  • 使用大写字母表示常量
  • 变量名应避免与系统环境变量、Shell 内置命令、常用命令冲突。

✅ 有效的 Shell 变量命名方式:

KAICZ="www.kaicz.com"   # 使用大写字母表示常量
LD_LIBRARY_PATH="/bin/" # 变量名包含下划线
_var="123"              # 变量名支持下划线开头
var2="abc"              # 变量名支持字母和数字组合

⛔ 无效的 Shell 变量命名方式:

if="some_value"         # 避免使用 if 等保留字作为变量名
variable_with_$=42      # 避免使用 $ 等特殊符号作为变量名
variable with="value"   # 避免使用空格作为变量名
variable_name = value   # 避免等号两侧使用空格

✅ 除了显式地直接赋值,还可以通过循环语句为变量赋值,如:

for file in `ls /etc`
# 等价于
for file in $(ls /etc)

通过上面的语句,将/etc下目录的文件名循环展示出来。

1. 使用变量

✅ 使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

bash
复制
website_url="kaicz.com" # 定义变量
echo $website_url       # 使用变量时,变量名不加花括号
echo ${website_url}     # 使用变量时,变量名添加花括号,加花括号是为了帮助解释器识别变量的边界

✅ 已定义的变量,可以被重新定义,如:

bash
复制
website_url="kaicz.com" # 定义变量
echo $website_url       # 使用变量
website_url="qq.com"    # 重新定义变量
echo $website_url       # 使用变量

这样写是合法的,但注意,第二次赋值的时候不能写 $website_url="qq.com",使用变量的时候才加美元符 ($)。

2. 只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。

✅ 下面的例子尝试更改只读变量,结果报错:

bash
复制
#!/bin/bash

myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.kaicz.com"

✅ 运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

3. 删除变量

使用unset命令可以将变量删除,但是不能删除只读变量。

✅ 下面的例子尝试更改只读变量,结果报错:

bash
复制
#!/bin/sh

myUrl="https://www.kaicz.com"
unset myUrl
echo $myUrl

以上实例执行后,不会有任何输出。

4. 变量类型

Shell 支持多种类型的变量,主要包括字符串变量、整数变量、数组变量、环境变量和特殊变量。


Shell 字符串

字符串是 Shell 编程中最常用且最有用的数据类型。事实上,Shell 脚本主要处理的数据类型就是字符串和数字,几乎不存在其他常用的数据类型。定义字符串时,可以使用单引号、双引号,也可以完全不使用引号。

1. 单引号

单引号中的内容会被原样输出,其中的变量不会被解析;单引号必须成对出现(即使使用转义符也无法单独使用)。

bash
复制
name='kaicz'            # 输出结果:kaicz
str='It'"'"'s working.' # 输出结果:It's working.
greeting='Hi, '"$name"  # 输出结果:Hi, kaicz
msg='Time: '"$(date)"   # 输出结果:Time: 2025-08-20 20:59:20
str='Hello,''World'     # 输出结果:Hello,World

2. 双引号

双引号里可以有变量,双引号里可以出现转义字符。

bash
复制
name="kaicz"            # 输出结果:kaicz
str='It'"'"'s working.' # 输出结果:It's working.
greeting="Hi, $name!"   # 输出结果:Hi, kaicz!
msg="Time: \"$(date)\"" # 输出结果:Time: "2025-08-20 20:59:20"

3. 获取字符串长度

使用${#variable_name}(最常用,推荐),这是 Bash/Shell 中最直接、最标准的获取字符串长度的方法。

bash
复制
website="www.kaicz.com" # 定义字符串变量
echo $website           # 输出结果:www.kaicz.com
echo ${#website}        # 输出结果:15

4. 提取子字符串

提取字符串中,第 4 个字符开始,长度为 5 个字符(第一个字符的索引值为 0):

bash
复制
website="www.kaicz.com" # 定义字符串变量
echo $website           # 输出结果:www.kaicz.com
echo ${website:4:5}     # 输出结果:kaicz

5. 查找子字符串

查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):

bash
复制
website="www.kaicz.com" # 定义字符串变量
echo $website           # 输出结果:www.kaicz.com
echo `expr index "$website" io` # 输出结果:7

注意:以上脚本中`是反引号,而不是单引号',不要看错了哦。


Shell 数组

bash 支持一维数组 (不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

1. 定义数组

在 Shell 中,用小括号()来表示数组,数组元素用 "空格" 符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

✅ 定义一个数组,元素用空格分隔,整个列表用括号括起来:

fruits=("Apple" "Banana" "Orange")

✅ 定义一个数组,可以写成多行,更清晰,整个列表用括号括起来:

fruits=(
  "Apple"
  "Banana"
  "Orange"
)

✅ 定义一个数组,也可以逐个元素赋值:

fruits[0]="Apple"
fruits[1]="Banana"
fruits[2]="Orange"

2. 读取数组

读取数组元素值的一般格式是${数组名[下标]},比如:

echo ${fruits[0]}       # 输出:Apple

如果要读取整个数组,可以使用${数组名[@]}${数组名[*]},比如:

echo ${fruits[@]}       # 输出:Apple Banana Orange

3. 获取数组的长度

获取数组长度的一般格式是${#数组名[@]},比如:

echo ${#fruits[@]}      # 输出:3
length=${#fruits[*]}    # 输出:3
length=${#fruits[2]}    # 输出:6 (获取第三个元素的长度)

Shell 注释

在 Shell 编程中,以井号#开头的行为注释行,解释器会忽略这些行。

#--------------------------------------------
# 这是一个注释
# author:开创者教程
# site:www.kaicz.com
# slogan:成长的路上,开创者与你同行!
#--------------------------------------------
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
##### 用户配置区 结束  #####


评论区 0
发表评论