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'