允许用户设置的变量中的空格/空格

Ann*_*ann 0 bash

我编写的许多脚本都接受在单独的.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脚本中是否有一种简单的方法允许这样做?如果是这样,怎么样?

Cha*_*ffy 5

根本不需要外部工具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_PRELOADPATH可能影响系统安全性的变量.

它还使您的配置格式更加灵活,允许您使用不是有效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)

  • @shellter,是的,它需要转换,但我认为*应该*被转换 - 当内部变量名称不会被配置无意中覆盖时,它将更加明确且更安全. (2认同)