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

时间:2011-03-08 04:27:53

标签: bash variables configuration-files

我想调用变量的设置文件,如何在bash中执行此操作?

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

production="liveschool_joe"
playschool="playschool_joe"

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

#!/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

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

9 个答案:

答案 0 :(得分:196)

简短回答

使用source命令。


使用source

的示例

例如:

config.sh

#!/usr/bin/env bash
production="liveschool_joe"
playschool="playschool_joe"
echo $playschool

script.sh

#!/usr/bin/env bash
source config.sh
echo $production

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

~$ sh ./script.sh 
playschool_joe
liveschool_joe

这是因为source命令实际上运行程序。 config.sh中的所有内容都已执行。


另一种方式

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

运行exportecho $ENV应该是您需要了解的有关访问变量的所有信息。访问环境变量的方式与局部变量相同。

设置它们,说:

export variable=value

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

答案 1 :(得分:22)

使用点更短:

#!/bin/bash
. CONFIG_FILE

sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool

答案 2 :(得分:13)

使用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

答案 3 :(得分:11)

我在安全性方面遇到了同样的问题,我找到了解决方案here

我的问题是,我想在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"

现有解决方案包括使用“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 ~/*

要解决这个问题,我们可能只想在该文件中使用NAME=VALUE形式的构造(变量赋值语法)和注释(尽管从技术上讲,注释并不重要)。因此,我们可以使用相当于egrep的{​​{1}}命令检查配置文件。

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

grep -E

答案 4 :(得分:7)

在Bash中,来源一些命令的输出,而不是文件:

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

reference

答案 5 :(得分:3)

将参数文件转换为环境变量

通常我会解析而不是采购,以避免文件中某些工件的复杂性。它还为我提供了专门处理报价和其他事情的方法。我的主要目标是保留&#39; =&#39;之后的所有内容。作为文字,甚至是双引号和空格。

NameValuePair

注意我必须要做的一个小技巧,将我的引用文本视为一个带有#!/bin/bash function cntpars() { echo " > Count: $#" echo " > Pars : $*" echo " > par1 : $1" echo " > par2 : $2" if [[ $# = 1 && $1 = "value content" ]]; then echo " > PASS" else echo " > FAIL" return 1 fi } function readpars() { while read -r line ; do key=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\1/') val=$(echo "${line}" | sed -e 's/^\([^=]*\)=\(.*\)$/\2/' -e 's/"/\\"/g') eval "${key}=\"${val}\"" done << EOF var1="value content" var2=value content EOF } # Option 1: Will Pass echo "eval \"cntpars \$var1\"" eval "cntpars $var1" # Option 2: Will Fail echo "cntpars \$var1" cntpars $var1 # Option 3: Will Fail echo "cntpars \"\$var1\"" cntpars "$var1" # Option 4: Will Pass echo "cntpars \"\$var2\"" cntpars "$var2" 函数空间的单个参数。需要进行一次额外的评估。如果我不这样做,如在选项2中那样,我将传递2个参数,如下所示:

  • cntpars
  • "value

在命令执行期间双引号会导致保留参数文件中的双引号。因此,第三选项也失败了。

另一种选择当然只是不提供双引号中的变量,如选项4中所示,然后只是为了确保在需要时引用它们。

要记住一些事情。

实时查询

我喜欢做的另一件事是进行实时查找,避免使用环境变量:

content"

效率最高,但文件较小的文件非常干净。

答案 6 :(得分:2)

If the variables are being generated and not saved to a file you cannot pipe them in into $m. The deceptively simple way to do it is this:

source

答案 7 :(得分:-1)

包含变量的脚本可以使用bash导入。 考虑一下script-variable.sh

#!/bin/sh
scr-var=value

考虑将使用变量的实际脚本:

 #!/bin/sh
 bash path/to/script-variable.sh
 echo "$scr-var"

答案 8 :(得分:-1)

为防止命名冲突,仅导入所需的变量:

  // Get the DOM element.
const accordions = Array.from(document.querySelectorAll('.js- 
accordion'));

const handleClick = accordion => () => {
// Here we set the data attribute of the selected accordion.
const selectedState = accordion.dataset.selected;
/**
 * If the selected accordion's data attribute equals true –
 * then we set it to false.
 */
accordion.dataset.selected = (accordion.dataset.selected === 'true') ? 'false' : 'true'; // eslint-disable-line no-param-reassign

// Set variables
const container = accordion.querySelector('.js-accordion__container');
const body = accordion.querySelector('.js-accordion__body');
const unit = 'px';

/**
 * When the state of the accordion is set to true
 * we return the height of the content and
 * and set the collapsible state to true.
 */
if (selectedState === 'true') {
  container.style.height = `${body.offsetHeight + unit}`;
  accordion.setAttribute('aria-expanded', true);
} else {
  container.style.height = null;
  accordion.setAttribute('aria-expanded', false);
 }
};

 // Bind the event listener.
 accordions.map(accordion => accordion.querySelector('.js- 
 accordion__trigger').addEventListener('click', 
 handleClick(accordion)));