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

问题描述 投票:124回答:9

我想为变量调用一个设置文件,我怎样才能在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等......?

bash variables configuration-files
9个回答
206
投票

简短的回答

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

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


22
投票

使用点更短:

#!/bin/bash
. CONFIG_FILE

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

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

11
投票

我有同样的问题,特别是在安全的情况下,我找到了解决方案qazxsw poi。

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

here

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

为了解决这个问题,我们可能只想在该文件中使用 ################### 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来检查配置文件。

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

grep -E

7
投票

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

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

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


3
投票

Converting parameter file to Environment variables

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

reference

请注意我必须要做的小技巧,将我的引用文本视为一个带有#!/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中所示,然后只是为了确保在需要时引用它们。

请记住一些事情。

Real-time lookup

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

content"

不是最有效的,但较小的文件非常干净。


2
投票

如果生成变量但未保存到文件中,则无法将它们输入到lookup() { if [[ -z "$1" ]] ; then echo "" else ${AWK} -v "id=$1" 'BEGIN { FS = "=" } $1 == id { print $2 ; exit }' $2 fi } MY_LOCAL_VAR=$(lookup CONFIG_VAR filename.cfg) echo "${MY_LOCAL_VAR}" 中。看似简单的方法是这样的:

source

-1
投票

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

some command | xargs

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

#!/bin/sh
scr-var=value

-1
投票

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

 #!/bin/sh
 bash path/to/script-variable.sh
 echo "$scr-var"
© www.soinside.com 2019 - 2024. All rights reserved.