shell 脚本语言的变量用法详解
在 Shell 脚本中,变量无需声明类型,直接通过赋值定义。变量名区分大小写,通常使用大写字母作为命名约定(非强制)。赋值时等号()两侧不能有空格。VAR_NAME="value" # 定义字符串变量NUM=123 # 定义数值变量。
Shell脚本变量用法详解
以下是一个Shell脚本示例,展示变量的基本用法、特殊变量和常见操作:
#!/bin/bash
# 基本变量定义与使用
name="Shell Script"
version=1.0
echo "当前运行: $name 版本 $version"
# 只读变量
readonly const_value="constant"
echo "常量值: $const_value"
# 删除变量
temp_var="temporary"
unset temp_var
echo "已删除变量: ${temp_var:-未定义}"
# 特殊变量
echo "脚本名称: $0"
echo "第一个参数: $1"
echo "参数总数: $#"
echo "所有参数: $@"
echo "退出状态: $?"
echo "当前进程ID: $$"
# 变量替换
default_value="default"
echo "使用默认值: ${undefined_var:-$default_value}"
# 命令替换
current_date=`date +%Y-%m-%d`
echo "当前日期: $current_date"
# 算术运算
num1=10
num2=3
result=$((num1 + num2))
echo "计算结果: $result"
# 数组变量
colors=("red" "green" "blue")
echo "第一个颜色: ${colors[0]}"
echo "所有颜色: ${colors[@]}"
# 环境变量
echo "当前用户: $USER"
echo "家目录: $HOME"
echo "路径: $PATH"
# 字符串操作
str="hello world"
echo "字符串长度: ${#str}"
echo "子字符串: ${str:0:5}"
echo "替换: ${str/world/shell}"
# 输入变量
read -p "请输入您的名字: " user_name
echo "欢迎, $user_name"
变量类型说明
- 局部变量:仅在当前Shell实例中有效
- 环境变量:所有子进程均可访问的变量
- Shell变量:由Shell设置的特殊变量
变量命名规则
- 名称只能包含字母、数字和下划线
- 不能以数字开头
- 避免使用Shell关键字
- 习惯上使用大写字母表示常量
注意事项
- 等号两边不能有空格
- 字符串值建议使用双引号
- 单引号会禁用变量替换
- 使用${var}形式避免歧义
- 未定义的变量扩展为空值
Shell 脚本变量基础
- 变量的定义与赋值
- 变量命名规则(大小写敏感、禁止数字开头等)
- 变量的引用方式(
$var
或${var}
)
变量类型与作用域
- 局部变量(函数内生效)
- 环境变量(全局生效,
export
用法) - 特殊变量(
$0
、$#
、$*
等)
字符串变量操作
- 字符串拼接(直接连接或双引号嵌套)
- 字符串长度获取(
${#var}
) - 子字符串截取(
${var:start:length}
) - 字符串替换(
${var/old/new}
和全局替换${var//old/new}
)
数值变量运算
- 整数运算(
$(( ))
或let
命令) - 浮点数运算(借助
bc
或awk
) - 自增/自减操作(
((var++))
)
数组变量用法
- 数组定义与初始化(
arr=(val1 val2)
) - 数组元素访问(
${arr[index]}
) - 数组遍历(
for
循环结合${arr[@]}
) - 关联数组(
declare -A
声明)
变量高级技巧
- 变量默认值设置(
${var:-default}
) - 只读变量(
readonly
声明) - 变量间接引用(
eval
或!
符号) - 变量类型检查(
declare -p
)
实际应用案例
- 脚本参数处理(
$1
、$2
结合shift
) - 配置文件读取(变量动态加载)
- 日志输出中的变量格式化
注意事项与调试
- 变量未定义的常见错误
- 引号的使用场景(防止空格分割)
- 调试技巧(
set -x
跟踪变量展开)
该大纲覆盖基础到进阶的变量用法,适合作为技术文章或教程的框架。
Shell脚本变量基础
Shell脚本中的变量用于存储数据,无需声明类型,直接赋值即可。变量名区分大小写,通常使用大写字母表示常量,小写字母表示普通变量。
定义与赋值
name="John" # 字符串赋值
count=10 # 整数赋值
引用变量
使用 $
符号或 ${}
引用变量:
echo $name
echo ${count}
变量类型与作用域
局部变量
默认情况下,变量仅在当前脚本中有效:
local_var="value" # 仅在当前脚本或函数内可见
环境变量
通过 export
使变量对子进程可见:
export PATH=$PATH:/usr/local/bin
特殊变量
$0
:脚本名称$1
~$9
:脚本参数$#
:参数个数$?
:上一条命令的退出状态
字符串操作
拼接字符串
greeting="Hello, "$name"!"
获取字符串长度
length=${#name}
截取子串
substr=${name:1:3} # 从第2个字符开始截取3个字符
数组变量
定义数组
fruits=("apple" "banana" "orange")
访问数组元素
echo ${fruits[0]} # 输出第一个元素
echo ${fruits[@]} # 输出所有元素
echo ${#fruits[@]} # 输出数组长度
变量替换与默认值
默认值替换
${var:-default} # 若var未定义,使用default
${var:=default} # 若var未定义,赋值default并返回
错误检查
${var:?error_msg} # 若var未定义,输出错误并退出
实际应用示例
读取用户输入
read -p "Enter your name: " username
echo "Welcome, $username!"
数学运算
sum=$((a + b)) # 使用 $(( )) 进行算术运算
参考资源推荐
- 《Linux命令行与Shell脚本编程大全》 - 中文经典教材,涵盖Shell变量详解。
- 《Shell脚本学习指南》 - 针对变量操作和高级用法有详细案例。
- GNU Bash官方手册(中文翻译版) - 提供完整的变量语法规范。
以上内容可通过图书馆或在线技术社区(如CSDN、掘金)获取电子版或章节试读。
变量定义与赋值
在 Shell 脚本中,变量无需声明类型,直接通过赋值定义。变量名区分大小写,通常使用大写字母作为命名约定(非强制)。赋值时等号(=
)两侧不能有空格。
VAR_NAME="value" # 定义字符串变量
NUM=123 # 定义数值变量
变量引用
使用 $
符号或 ${}
引用变量。${}
可避免变量名与后续字符混淆,推荐使用。
echo $VAR_NAME # 输出变量值
echo ${VAR_NAME}_suffix # 明确变量边界
变量类型与默认值
Shell 变量默认为字符串类型,即使赋值为数字。可通过以下方式设置默认值或检测未定义变量:
${VAR:-default} # 若VAR未定义或为空,返回default
${VAR:=default} # 若VAR未定义或为空,赋值为default并返回
${VAR:?error_msg} # 若VAR未定义或为空,输出错误并终止脚本
环境变量与局部变量
- 环境变量:通过
export
导出,子进程可继承。export PATH=$PATH:/new_path # 导出为环境变量
- 局部变量:仅在当前脚本或函数中生效。
特殊变量
Shell 提供内置特殊变量,用于脚本操作:
$0
:脚本名称$1
~$9
:脚本参数$#
:参数个数$@
:所有参数(列表形式)$?
:上一条命令的退出状态码
数组变量
Shell 支持一维数组,下标从0开始:
ARR=("a" "b" "c") # 定义数组
echo ${ARR[1]} # 输出第二个元素(b)
echo ${ARR[@]} # 输出所有元素
只读变量
通过 readonly
声明不可修改的变量:
readonly CONST="immutable"
变量作用域
函数内定义的变量默认为全局变量。使用 local
关键字限定为局部变量:
func() {
local LOCAL_VAR="local"
}
字符串操作
- 获取长度:
${#VAR}
- 子字符串:
${VAR:start:length}
- 替换:
${VAR/old/new}
(仅替换第一个匹配)
数值运算
需用 $(( ))
或 let
进行算术运算:
SUM=$((1 + 2)) # 输出3
let "SUM = 1 + 2" # 等效写法
Shell 变量基础
Shell 变量用于存储数据,无需声明类型,直接赋值即可使用。变量名通常大写(约定俗成),但区分大小写。
定义变量(无空格):
VAR_NAME="value"
使用变量:通过 $
或 ${}
引用:
echo $VAR_NAME # 简单引用
echo ${VAR_NAME} # 明确变量边界(推荐)
变量类型
-
局部变量:仅在当前 Shell 进程中有效。
LOCAL_VAR="local"
-
环境变量:全局有效,可被子进程继承。
export GLOBAL_VAR="global"
-
特殊变量:
$0
:脚本名称$1
,$2
...:脚本参数$#
:参数个数$?
:上一条命令的退出状态(0 表示成功)
字符串操作
-
拼接字符串:
GREET="Hello" NAME="World" MESSAGE="$GREET, ${NAME}!"
-
获取长度:
STR="test" echo ${#STR} # 输出 4
-
子字符串截取:
STR="abcdef" echo ${STR:1:3} # 输出 bcd(从索引1开始,长度3)
数值运算
Shell 默认将变量视为字符串,需用 $(( ))
或 let
进行算术运算。
NUM1=5
NUM2=3
SUM=$((NUM1 + NUM2)) # 输出 8
数组用法
-
定义数组:
ARRAY=("a" "b" "c")
-
访问元素:
echo ${ARRAY[1]} # 输出 b(索引从0开始)
-
获取所有元素:
echo ${ARRAY[@]} # 输出 a b c
只读变量与删除
-
只读变量:不可修改。
readonly CONST="immutable"
-
删除变量:
unset VAR_NAME
变量默认值处理
-
未定义时使用默认值:
echo ${UNDEFINED_VAR:-"default"} # 输出 default
-
未定义时赋值并返回:
echo ${UNDEFINED_VAR:="new_value"} # 赋值后输出 new_value
示例综合
#!/bin/bash
USER="Alice"
echo "Hello, ${USER}!"
echo "Script name: $0"
echo "First argument: $1"
# 数组遍历
FRUITS=("Apple" "Banana" "Cherry")
for fruit in "${FRUITS[@]}"; do
echo "Fruit: $fruit"
done
通过以上方法,可以灵活使用 Shell 变量处理字符串、数值、数组等场景。
更多推荐
所有评论(0)