Shell 间接引用
概述
本人在研究docker官方shell脚本中发现官方一直在使用间接引用,故学习总结,作为己用。
官方脚本示例
此代码是ENV处理代码
# file_env 'MYSQL_ROOT_PASSWORD' file_env() { local var="$1" local fileVar="${var}_FILE" local def="${2:-}" if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then mysql_error "Both $var and $fileVar are set (but are exclusive)" fi local val="$def" if [ "${!var:-}" ]; then val="${!var}" elif [ "${!fileVar:-}" ]; then val="$(< "${!fileVar}")" fi export "$var"="$val" unset "$fileVar" }
解析
其中大量出现${!var}类似引用,自定义示例:
[root@localhost ~]# By=520 [root@localhost ~]# Wshile=By [root@localhost ~]# echo ${Wshile} By [root@localhost ~]# echo ${!Wshile} 520 [root@localhost ~]# echo ${!Wshile:-} 520 [root@localhost ~]# unset Wshile // 如果有只则输出,没有则为空 [root@localhost ~]# echo ${!Wshile:-}
结合官方代码
#!/bin/bash file_env() { local MYSQL_USER=1 local MYSQL_USER_FILE=2 local var="$1" echo "${var} ---- 1" local fileVar="${var}_FILE" echo "${fileVar} ---- 2" local def="${2:-}" echo "${!var} ---- 3" echo "${!fileVar} ---- 4" if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then echo "error" fi local val="$def" if [ "${!var:-}" ]; then val="${!var}" elif [ "${!fileVar:-}" ]; then val="$(< "${!fileVar}")" fi export "$var"="$val" unset "$fileVar" } file_env 'MYSQL_USER'