Linux 变量声明

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习 Linux shell 脚本中的变量,这些变量对于在脚本中存储和处理数据至关重要。变量允许你在脚本执行期间临时存储信息,并在整个代码中重复使用这些信息。

理解如何声明和使用变量是编写 Linux shell 脚本的一项基本技能。这些知识将帮助你自动化任务、管理配置,并为各种应用程序创建更具动态性的脚本。

在本实验结束时,你将了解如何在 bash 脚本中创建简单变量、整数变量和数组,这些是更高级 shell 脚本技术的基础。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/declare("Variable Declaring") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") linux/TextProcessingGroup -.-> linux/expr("Evaluate Expressions") linux/VersionControlandTextEditorsGroup -.-> linux/nano("Simple Text Editing") subgraph Lab Skills linux/echo -.-> lab-271265{{"Linux 变量声明"}} linux/declare -.-> lab-271265{{"Linux 变量声明"}} linux/chmod -.-> lab-271265{{"Linux 变量声明"}} linux/cd -.-> lab-271265{{"Linux 变量声明"}} linux/mkdir -.-> lab-271265{{"Linux 变量声明"}} linux/expr -.-> lab-271265{{"Linux 变量声明"}} linux/nano -.-> lab-271265{{"Linux 变量声明"}} end

基本变量声明

在这一步中,你将学习如何在 bash 脚本中声明和使用基本变量。Linux shell 脚本中的变量允许你临时存储数据,并在脚本的后续部分引用这些数据。

首先,让我们为项目创建一个目录并进入该目录:

mkdir -p ~/project
cd ~/project

现在,使用 nano 文本编辑器创建一个名为 variables.sh 的脚本:

nano ~/project/variables.sh

在编辑器中,输入以下内容:

#!/bin/bash

## Declaring a basic variable
BALLOON_COLOR="red"

## Displaying the variable value
echo "The balloon color is: $BALLOON_COLOR"

在这个脚本中,我们声明了一个名为 BALLOON_COLOR 的变量,并将其值设置为 "red"。然后,echo 命令会显示这个变量的值。

要在 nano 中保存文件,请按 Ctrl+O,然后按 Enter 确认。要退出 nano,请按 Ctrl+X

现在,使脚本具有可执行权限:

chmod +x ~/project/variables.sh

这个命令赋予文件执行权限,允许你将其作为程序运行。

最后,执行你的脚本:

./variables.sh

你应该会看到以下输出:

The balloon color is: red

这表明你的变量已成功声明,并且可以通过在变量名前加上 $ 符号来访问其值。

声明整数变量

在这一步中,你将学习如何在 bash 脚本中声明和使用整数变量。-i 标志告诉 bash 该变量应被视为整数,这在进行数值运算时非常有用。

再次打开 variables.sh 脚本进行编辑:

nano ~/project/variables.sh

修改脚本以包含一个整数变量:

#!/bin/bash

## Declaring a basic string variable
BALLOON_COLOR="red"

## Declaring an integer variable
declare -i BALLOON_SIZE=10

## Displaying both variables
echo "The balloon color is: $BALLOON_COLOR"
echo "The balloon size is: $BALLOON_SIZE inches"

## Performing arithmetic with the integer variable
declare -i DOUBLE_SIZE=BALLOON_SIZE*2
echo "Double the size would be: $DOUBLE_SIZE inches"

在这个更新后的脚本中:

  1. 我们保留了原来的字符串变量 BALLOON_COLOR
  2. 我们使用 declare -i 语法添加了一个新的整数变量 BALLOON_SIZE
  3. 我们展示了如何对整数变量进行算术运算

使用 Ctrl+OEnter 保存文件,然后使用 Ctrl+X 退出 nano。

现在再次运行脚本:

./variables.sh

你应该会看到以下输出:

The balloon color is: red
The balloon size is: 10 inches
Double the size would be: 20 inches

-i 声明让 bash 能够识别该变量应被视为整数,从而可以进行算术运算。这在脚本中的计数器、计算和数值处理方面特别有用。

使用数组变量

在这一步中,你将学习如何声明和使用数组变量。数组允许你在一个变量名下存储多个值,这在处理相关数据集合时非常有用。

让我们再次编辑脚本:

nano ~/project/variables.sh

更新脚本以包含一个数组变量:

#!/bin/bash

## Declaring a basic string variable
BALLOON_COLOR="red"

## Declaring an integer variable
declare -i BALLOON_SIZE=10

## Declaring an array variable
declare -a BALLOON_COLORS=("red" "green" "blue" "purple" "yellow")

## Displaying individual variables
echo "The balloon color is: $BALLOON_COLOR"
echo "The balloon size is: $BALLOON_SIZE inches"

## Displaying all array elements
echo "Available balloon colors are: ${BALLOON_COLORS[*]}"

## Displaying specific array elements
echo "The first color is: ${BALLOON_COLORS[0]}"
echo "The third color is: ${BALLOON_COLORS[2]}"

## Count of array elements
echo "Number of available colors: ${#BALLOON_COLORS[@]}"

在这个更新后的脚本中:

  1. 我们保留了现有的变量
  2. 我们使用 declare -a 语法添加了一个数组变量 BALLOON_COLORS
  3. 我们展示了不同的访问数组元素的方式:
    • ${BALLOON_COLORS[*]} 显示所有元素
    • ${BALLOON_COLORS[0]} 访问第一个元素(bash 中的数组是从 0 开始索引的)
    • ${#BALLOON_COLORS[@]} 给出数组中的元素数量

使用 Ctrl+OEnter 保存文件,然后使用 Ctrl+X 退出 nano。

现在再次运行脚本:

./variables.sh

你应该会看到以下输出:

The balloon color is: red
The balloon size is: 10 inches
Available balloon colors are: red green blue purple yellow
The first color is: red
The third color is: blue
Number of available colors: 5

当你需要管理相关数据集合时,数组非常强大。它们允许你组织多个值,并可以单独或作为一个组来访问这些值。这在管理项目列表(如文件名、用户信息或配置选项)时特别有用。

变量操作与扩展

在这一步中,你将学习如何以不同方式操作和扩展变量。这些技术能让你在不创建新变量的情况下修改变量值,这在文本处理和数据转换中非常有用。

让我们再次编辑脚本:

nano ~/project/variables.sh

更新脚本以演示变量操作:

#!/bin/bash

## Declaring basic variables
NAME="linux"
MESSAGE="Hello, world!"
FILE_PATH="/home/user/documents/report.txt"

echo "Original values:"
echo "NAME = $NAME"
echo "MESSAGE = $MESSAGE"
echo "FILE_PATH = $FILE_PATH"

echo -e "\nVariable manipulation examples:"

## Convert to uppercase
echo "NAME in uppercase: ${NAME^^}"

## Convert to lowercase
UPPER_NAME="LINUX"
echo "UPPER_NAME in lowercase: ${UPPER_NAME,,}"

## Get string length
echo "Length of MESSAGE: ${#MESSAGE}"

## Extract substring (starting at position 7, 5 characters)
echo "Substring of MESSAGE: ${MESSAGE:7:5}"

## Replace part of string
echo "Replace 'world' with 'Linux': ${MESSAGE/world/Linux}"

## Extract filename from path
echo "Filename from path: ${FILE_PATH##*/}"

## Extract directory from path
echo "Directory from path: ${FILE_PATH%/*}"

## Default value if variable is unset
UNSET_VAR=""
echo "Default value example: ${UNSET_VAR:-default value}"

此脚本展示了几种操作变量的方法:

  1. ${NAME^^} - 转换为大写
  2. ${UPPER_NAME,,} - 转换为小写
  3. ${#MESSAGE} - 获取字符串长度
  4. ${MESSAGE:7:5} - 提取子字符串(位置和长度)
  5. ${MESSAGE/world/Linux} - 替换字符串的一部分
  6. ${FILE_PATH##*/} - 从开头移除最长匹配项(提取文件名)
  7. ${FILE_PATH%/*} - 从末尾移除最短匹配项(提取目录)
  8. ${UNSET_VAR:-default value} - 如果变量未设置则使用默认值

使用 Ctrl+OEnter 保存文件,然后使用 Ctrl+X 退出 nano。

现在运行脚本:

./variables.sh

你应该会看到类似于以下的输出:

Original values:
NAME = linux
MESSAGE = Hello, world!
FILE_PATH = /home/user/documents/report.txt

Variable manipulation examples:
NAME in uppercase: LINUX
UPPER_NAME in lowercase: linux
Length of MESSAGE: 13
Substring of MESSAGE: world
Replace 'world' with 'Linux': Hello, Linux!
Filename from path: report.txt
Directory from path: /home/user/documents
Default value example: default value

这些变量操作技术在处理文本数据、从字符串中提取信息以及在脚本中处理默认值时极为有用。

环境变量与变量作用域

在这最后一步中,你将了解环境变量、变量作用域,以及如何导出变量以使它们可被其他进程使用。

创建一个名为 environment.sh 的新脚本:

nano ~/project/environment.sh

添加以下内容:

#!/bin/bash

## Displaying some common environment variables
echo "USER: $USER"
echo "HOME: $HOME"
echo "PATH: $PATH"
echo "PWD: $PWD"
echo "SHELL: $SHELL"

## Creating a local variable
LOCAL_VAR="This is a local variable"
echo "LOCAL_VAR: $LOCAL_VAR"

## Exporting a variable to make it available to child processes
export EXPORTED_VAR="This variable is exported"
echo "EXPORTED_VAR: $EXPORTED_VAR"

## Demonstrate how variables work in subshells
echo -e "\nVariable behavior in subshell:"
(
  echo "Inside subshell:"
  echo "  LOCAL_VAR: $LOCAL_VAR"
  echo "  EXPORTED_VAR: $EXPORTED_VAR"
  echo "  Creating subshell-only variable"
  SUBSHELL_VAR="This variable only exists in the subshell"
  echo "  SUBSHELL_VAR: $SUBSHELL_VAR"
)

echo -e "\nAfter subshell:"
echo "LOCAL_VAR: $LOCAL_VAR"
echo "EXPORTED_VAR: $EXPORTED_VAR"
echo "SUBSHELL_VAR: $SUBSHELL_VAR" ## This will be empty

## Creating a script to test export behavior
echo -e "\nCreating child script to test variable export..."
cat > ~/project/child_script.sh << 'EOF'
#!/bin/bash
echo "In child script:"
echo "EXPORTED_VAR: $EXPORTED_VAR"
echo "LOCAL_VAR: $LOCAL_VAR"
EOF

chmod +x ~/project/child_script.sh

## Run the child script
echo -e "\nRunning child script:"
./child_script.sh

此脚本演示了:

  1. 常见的环境变量(USERHOMEPATH 等)
  2. 局部变量和导出变量之间的区别
  3. 变量在子 shell 中的行为(括号用于创建子 shell)
  4. 导出的变量如何被子进程继承

使用 Ctrl+OEnter 保存文件,然后使用 Ctrl+X 退出 nano。

使脚本可执行:

chmod +x ~/project/environment.sh

现在运行脚本:

./environment.sh

输出将向你展示变量在不同上下文中的行为:

  • 环境变量由系统预先设置
  • 局部变量仅存在于当前脚本中
  • 导出的变量会传递给子进程
  • 在子 shell 中创建的变量在父 shell 中不可用

在编写会生成子进程或引入其他脚本的复杂脚本时,理解变量作用域至关重要。它有助于你管理系统不同部分之间的数据流。

总结

在这个实验中,你学习了 Linux shell 脚本中变量声明和操作的基础知识。你探索了:

  • 基本的变量声明和使用
  • 整数变量和算术运算
  • 用于存储数据集合的数组变量
  • 用于文本处理的变量操作技术
  • 环境变量和变量作用域

这些技能构成了 shell 脚本的基础,对于在 Linux 环境中自动化任务至关重要。变量允许你在脚本执行期间存储和处理数据,从而创建更具动态性和灵活性的脚本。

你现在可以使用这些技术来:

  • 在脚本中存储配置设置
  • 处理用户输入和文件内容
  • 操作文本数据和文件路径
  • 在不同的脚本和进程之间共享数据

随着你在 Linux shell 脚本领域继续探索,你会发现掌握变量的使用将为创建强大而高效的自动化工具带来更多可能性。