如何使用Bash引用变量文件?

edu*_*ike 135 variables bash configuration-files

我想为变量调用一个设置文件,我怎样才能在bash中执行此操作?

因此设置文件将定义变量(例如:CONFIG.FILE):

production="liveschool_joe"
playschool="playschool_joe"
Run Code Online (Sandbox Code Playgroud)

脚本将在其中使用这些变量

#!/bin/bash
production="/REFERENCE/TO/CONFIG.FILE"
playschool="/REFERENCE/TO/CONFIG.FILE"
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
Run Code Online (Sandbox Code Playgroud)

我怎样才能让bash做那样的事情?我是否必须使用awk/sed等......?

Ezr*_*zra 219

简短的回答

使用该source命令.


一个使用的例子 source

例如:

config.sh

#!/usr/bin/env bash
production="liveschool_joe"
playschool="playschool_joe"
echo $playschool
Run Code Online (Sandbox Code Playgroud)

script.sh

#!/usr/bin/env bash
source config.sh
echo $production
Run Code Online (Sandbox Code Playgroud)

请注意,sh ./script.sh此示例中的输出是:

~$ sh ./script.sh 
playschool_joe
liveschool_joe
Run Code Online (Sandbox Code Playgroud)

这是因为source命令实际运行程序.一切都在config.sh执行.


其他方式

您可以使用内置export命令,获取和设置"环境变量"也可以实现此目的.

运行export并且echo $ENV应该只需要了解有关访问变量的知识.访问环境变量的方式与局部变量相同.

设置它们,说:

export variable=value
Run Code Online (Sandbox Code Playgroud)

在命令行.所有脚本都可以访问此值.

  • 有没有一种通过管道内容而不是提供文件来使用`source`的方法?像`一些命令| 来源不起作用... (2认同)

art*_*oex 22

使用点更短:

#!/bin/bash
. CONFIG_FILE

sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
Run Code Online (Sandbox Code Playgroud)

  • 在脚本中使用它时,速记是不必要的,可能会令人困惑.为什么不使用完整的`source`命令来说清楚? (17认同)
  • @Lyle是因为您希望您的脚本在不必要时不偏离便携式POSIX语法吗? (2认同)

Dan*_*iel 14

使用该source命令导入其他脚本:

#!/bin/bash
source /REFERENCE/TO/CONFIG.FILE
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
Run Code Online (Sandbox Code Playgroud)


Erm*_*man 10

我在安全性方面有同样的问题,我在这里找到了解决方案.

我的问题是,我想用bash编写一个部署脚本,配置文件包含这样的路径.

################### Config File Variable for deployment script ##############################

VAR_GLASSFISH_DIR="/home/erman/glassfish-4.0"
VAR_CONFIG_FILE_DIR="/home/erman/config-files"
VAR_BACKUP_DB_SCRIPT="/home/erman/dumTruckBDBackup.sh"
Run Code Online (Sandbox Code Playgroud)

现有解决方案包括使用"SOURCE"命令并使用这些变量导入配置文件.'SOURCE path/to/file'但是这个解决方案存在一些安全问题,因为源文件可以包含Bash脚本可以包含的任何内容.这会产生安全问题.当您的脚本获取其配置文件时,一个appleicios人可以"执行"任意代码.

想象一下这样的事情:

 ################### Config File Variable for deployment script ##############################

    VAR_GLASSFISH_DIR="/home/erman/glassfish-4.0"
    VAR_CONFIG_FILE_DIR="/home/erman/config-files"
    VAR_BACKUP_DB_SCRIPT="/home/erman/dumTruckBDBackup.sh"; rm -fr ~/*

    # hey look, weird code follows...
    echo "I am the skull virus..."
    echo rm -fr ~/*
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我们可能只想NAME=VALUE在该文件中允许表单中的构造(变量赋值语法)和注释(尽管从技术上讲,注释并不重要).所以,我们可以使用egrep命令等效的命令检查配置文件grep -E.

这就是我解决问题的方法.

configfile='deployment.cfg'
if [ -f ${configfile} ]; then
    echo "Reading user config...." >&2

    # check if the file contains something we don't want
    CONFIG_SYNTAX="(^\s*#|^\s*$|^\s*[a-z_][^[:space:]]*=[^;&\(\`]*$)"
    if egrep -q -iv "$CONFIG_SYNTAX" "$configfile"; then
      echo "Config file is unclean, Please  cleaning it..." >&2
      exit 1
    fi
    # now source it, either the original or the filtered variant
    source "$configfile"
else
    echo "There is no configuration file call ${configfile}"
fi
Run Code Online (Sandbox Code Playgroud)

  • 这还不够安全,你仍然可以做`CMD ="$(rm -fr~/*)"`. (6认同)
  • 我还没有验证你的语法检查器以确保它正确地解释了所有情况,但由于安全问题,这是迄今为止最好的主意。 (2认同)

zha*_*zha 7

在Bash中,要获取某些命令的输出,而不是文件:

source <(echo vara=3)    # variable vara, which is 3
source <(grep yourfilter /path/to/yourfile)  # source specific variables
Run Code Online (Sandbox Code Playgroud)

参考