我编写的许多脚本都接受在单独的.config文件中设置的用户参数,并且来源于:
source "./Example.config" || exit
Run Code Online (Sandbox Code Playgroud)
为了清晰和健壮,我想允许用户在.config文件变量中包含空格,例如:
############################################################
## Example
############################################################
VAR1 = 25
VAR2 = Y
Run Code Online (Sandbox Code Playgroud)
而不是:
VAR1=25
VAR2=Y
Run Code Online (Sandbox Code Playgroud)
在bash脚本中是否有一种简单的方法允许这样做?如果是这样,怎么样?
根本不需要外部工具sed,或者使用source(因为它是道德等同物eval)所涉及的安全风险.以下是bash 4.0或更新版本的最佳实践方法:
shopt -s extglob # enable +()
declare -A config=( )
while IFS='=' read -r k v; do
[[ $v ]] || continue # skip lines that aren't assignments
[[ $k = '#'* ]] && continue # skip comments
k=${k%+([[:space:]])} # trim trailing whitespace from keys
v=${v#+([[:space:]])} # trim leading whitespace from values
config[$k]=$v
done <Example.config
Run Code Online (Sandbox Code Playgroud)
这使您可以将配置文件数据称为${config[foo]},将其保存在与变量(例如)之间的单独命名空间中$foo.这实际上是一种更好的安全实践:它确保不会在您的背后修改诸如LD_PRELOAD或PATH可能影响系统安全性的变量.
它还使您的配置格式更加灵活,允许您使用不是有效shell变量(包含短划线,空格等)的配置选项名称.例如,您可以允许:
# in your Example.config
server name = hello
Run Code Online (Sandbox Code Playgroud)
...和...
# in your code
echo "Using server name: ${config['server name']}"
Run Code Online (Sandbox Code Playgroud)