原文链接
在上一篇文章中,我们介绍了 Shell 编程的基本概念和简单的 Hello World 示例。本文将深入探讨 Shell 编程中的变量和数据类型,这是构建复杂脚本的基础。
变量
在 Shell 脚本中,变量是存储数据的容器。它们可以存储各种类型的数据,如数字、字符串或数组。
变量声明和赋值
在 Bash 中,变量的声明和赋值非常简单:
name="John Doe"
age=30
注意:等号两边不能有空格,否则会导致错误。
使用变量
要使用变量的值,只需在变量名前加上 $
符号:
echo "My name is $name and I am $age years old."
也可以使用 ${variable}
的形式,这在某些情况下更清晰:
echo "My name is ${name} and I am ${age} years old."
只读变量
可以使用 readonly
命令将变量设置为只读:
readonly PI=3.14159
PI=3.14 # 这将产生错误
删除变量
使用 unset
命令可以删除变量:
unset name
echo $name # 不会输出任何内容
注意:不能删除只读变量。
数据类型
虽然 Bash 不像其他编程语言那样有严格的数据类型,但它确实支持一些基本的数据类型。
字符串
字符串是 Shell 中最常用的数据类型。可以用单引号或双引号来定义字符串:
str1='This is a string'
str2="This is also a string"
单引号和双引号的区别:
- 单引号中的内容会原样输出,不会解析变量。
- 双引号中的内容会解析变量。
例如:
name="John"
echo 'Hello, $name' # 输出:Hello, $name
echo "Hello, $name" # 输出:Hello, John
字符串操作
- 字符串拼接:
str1="Hello"
str2="World"
str3="$str1 $str2"
echo $str3 # 输出:Hello World
- 获取字符串长度:
str="Hello, World!"
echo ${#str} # 输出:13
- 提取子字符串:
str="Hello, World!"
echo ${str:7:5} # 输出:World
数字
Bash 支持整数和浮点数:
int=42
float=3.14
数学运算
Bash 提供了多种进行数学运算的方法:
- 使用
expr
:
result=`expr 5 + 3`
echo $result # 输出:8
- 使用双括号:
result=$((5 + 3))
echo $result # 输出:8
- 使用
let
:
let result=5+3
echo $result # 输出:8
数组
Bash 支持一维数组:
fruits=("Apple" "Banana" "Cherry")
访问数组元素:
echo ${fruits[0]} # 输出:Apple
echo ${fruits[@]} # 输出:Apple Banana Cherry
获取数组长度:
echo ${#fruits[@]} # 输出:3
添加元素到数组:
fruits+=("Date")
echo ${fruits[@]} # 输出:Apple Banana Cherry Date
环境变量
环境变量是在系统级别定义的变量,可以被所有程序访问。一些常用的环境变量包括:
$HOME
:当前用户的主目录$PATH
:可执行文件的搜索路径$USER
:当前用户的用户名
查看所有环境变量:
env
设置新的环境变量:
export MY_VAR="Hello, Environment!"
echo $MY_VAR
特殊变量
Bash 提供了一些特殊变量,用于获取脚本的相关信息:
$0
:脚本名称$1
,$2
, …: 脚本的参数$#
:参数的数量$@
:所有参数的列表$?
:上一个命令的退出状态$$
:当前脚本的进程 ID
例子:
#!/bin/bash
echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Number of arguments: $#"
echo "All arguments: $@"
echo "Process ID: $$"
# 执行一个命令
ls /nonexistent
echo "Exit status of last command: $?"
变量作用域
默认情况下,Bash 中的变量是全局的。但是,可以使用 local
关键字创建局部变量:
function test_scope {
local local_var="I'm local"
echo "Inside function: $local_var"
}
test_scope
echo "Outside function: $local_var" # 不会输出任何内容
小技巧
- 使用
${variable:-default}
提供默认值:
echo "Hello, ${name:-World}" # 如果 name 未定义,将输出 "Hello, World"
- 使用
${variable:=default}
设置默认值:
echo "Hello, ${name:=World}" # 如果 name 未定义,将设置 name 为 "World" 并输出
- 使用
${!prefix*}
或${!prefix@}
展开所有以特定前缀开头的变量:
fruit_1="Apple"
fruit_2="Banana"
fruit_3="Cherry"
echo ${!fruit_*} # 输出:fruit_1 fruit_2 fruit_3