Linux环境下如何在if判断中检测变量是否为只读属性
Linux Shell中检测变量是否为只读的方法
基础检测方法(Bash/Zsh通用)
核心原理是利用declare -p命令输出的变量属性标识判断,只读变量的属性会携带r标记,直接在if语句中匹配该标记即可实现检测。
示例代码
- 基础判断写法
# 先定义一个只读变量用于测试 readonly test_var="只读测试值" # if判断逻辑 if [[ $(declare -p test_var 2>/dev/null) == *" -r "* ]]; then echo "test_var 是只读变量" else echo "test_var 不是只读变量" fi
参数说明
declare -p 变量名:输出指定变量的完整属性定义,包含读写、作用域等属性2>/dev/null:过滤变量不存在时的报错信息,避免干扰判断逻辑- 匹配
-r带空格的格式:避免其他属性中包含字符r导致的误判
完整测试用例
#!/bin/bash # 定义普通变量 normal_var="普通变量值" # 定义只读变量 readonly ro_var="只读变量值" # 检测普通变量 if [[ $(declare -p normal_var 2>/dev/null) == *" -r "* ]]; then echo "normal_var:只读变量" else echo "normal_var:非只读变量" fi # 检测只读变量 if [[ $(declare -p ro_var 2>/dev/null) == *" -r "* ]]; then echo "ro_var:只读变量" else echo "ro_var:非只读变量" fi
运行输出
normal_var:非只读变量
ro_var:只读变量
POSIX Shell兼容方法(无declare命令环境可用)
如果是极简环境的POSIX标准sh,没有内置declare命令,可以通过尝试给变量赋原值的方式判断,不会修改变量原有值:
#!/bin/sh # 封装检测函数 is_readonly() { var_name="$1" eval "old_val=\$$var_name" # 尝试给变量赋原有值,赋值失败则为只读 if ! eval "$var_name=\$old_val" 2>/dev/null; then return 0 else return 1 fi } # 使用示例 readonly test_val="测试只读值" if is_readonly test_val; then echo "test_val 是只读变量" fi
内容的提问来源于stack exchange,提问作者Aditya Purusharthi
相关产品推荐
相关产品推荐

