总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:Linux运维实战总结
一、变量间接调用
在Shell脚本中,变量间接调用是一种高级特性,它允许你通过另一个变量的值来动态地访问另一个变量的值。这在处理复杂的脚本或需要灵活处理变量名称时非常有用。
使用eval时要特别小心,因为它会执行字符串中的所有内容,这可能导致安全风险。尽量避免在不完全控制输入的情况下使用eval。
!符号和declare -n是更安全、更推荐的方法,特别是当你需要处理复杂的变量引用时。在使用这些高级特性时,确保你的Bash版本支持这些功能(例如,declare -n需要Bash 4.3及以上版本)。可以通过运行bash --version来检查你的Bash版本。
1.1、方法一:使用eval命令
#!/bin/bash
export CPU_PLATFROM="aarch64"
export OS_NAME="kylin"
export API_SERVER_HOST="192.168.1.111"
export API_SERVER_PORT="6443"
var_arrs=(CPU_PLATFROM OS_NAME API_SERVER_HOST API_SERVER_PORT)for var in ${var_arrs[@]}
do var2=`eval echo '$'"$var"`if [[ -z "${var2}" ]] ; thenecho "${var} is empty!"elseecho "${var} is $var2"fi
done
执行结果,如下所示:
root@k8s-master-58:~# ./check.sh
2025-08-12 15:47:01 Info: CPU_PLATFROM is aarch64
2025-08-12 15:47:01 Info: OS_NAME is kylin
2025-08-12 15:47:01 Info: API_SERVER_HOST is 192.168.1.111
2025-08-12 15:47:01 Info: API_SERVER_PORT is 6443
1.2、方法二:使用!符号(Bash 4.2及以上版本)
#!/bin/bash
export CPU_PLATFROM="aarch64"
export OS_NAME="kylin"
export API_SERVER_HOST="192.168.1.111"
export API_SERVER_PORT="6443"
var_arrs=(CPU_PLATFROM OS_NAME API_SERVER_HOST API_SERVER_PORT)for var in ${var_arrs[@]}
dovar2="${!var}"if [[ -z "${var2}" ]] ; thenecho "${var} is empty!"elseecho "${var} is $var2"fi
done
执行结果,如下所示:
root@k8s-master-58:~# ./check.sh
2025-08-12 15:47:01 Info: CPU_PLATFROM is aarch64
2025-08-12 15:47:01 Info: OS_NAME is kylin
2025-08-12 15:47:01 Info: API_SERVER_HOST is 192.168.1.111
2025-08-12 15:47:01 Info: API_SERVER_PORT is 6443
1.3、方法三:使用declare -n(Bash 4.3及以上版本)
#!/bin/bash
export CPU_PLATFROM="aarch64"
export OS_NAME="kylin"
export API_SERVER_HOST="192.168.1.111"
export API_SERVER_PORT="6443"
var_arrs=(CPU_PLATFROM OS_NAME API_SERVER_HOST API_SERVER_PORT)for var in ${var_arrs[@]}
dodeclare -n var2="$var" if [[ -z "${var2}" ]] ; thenecho "${var} is empty!"elseecho "${var} is $var2"fi
done
执行结果,如下所示:
root@k8s-master-58:~# ./check.sh
2025-08-12 15:47:01 Info: CPU_PLATFROM is aarch64
2025-08-12 15:47:01 Info: OS_NAME is kylin
2025-08-12 15:47:01 Info: API_SERVER_HOST is 192.168.1.111
2025-08-12 15:47:01 Info: API_SERVER_PORT is 6443
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:Linux运维实战总结