我想为变量调用一个设置文件,我怎样才能在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等......?
使用source
命令。
source
的一个例子例如:
#!/usr/bin/env bash
production="liveschool_joe"
playschool="playschool_joe"
echo $playschool
#!/usr/bin/env bash
source config.sh
echo $production
请注意,此示例中sh ./script.sh
的输出为:
~$ sh ./script.sh
playschool_joe
liveschool_joe
这是因为source
命令实际上运行程序。 config.sh
中的所有内容都已执行。
您可以使用内置的export
命令,获取和设置“环境变量”也可以实现此目的。
运行export
和echo $ENV
应该是访问变量所需要知道的全部内容。访问环境变量的方式与局部变量相同。
设置它们,说:
export variable=value
在命令行。所有脚本都可以访问此值。
使用点更短:
#!/bin/bash
. CONFIG_FILE
sudo -u wwwrun svn up /srv/www/htdocs/$production
sudo -u wwwrun svn up /srv/www/htdocs/$playschool
使用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
我有同样的问题,特别是在安全的情况下,我找到了解决方案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
在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
通常我会解析而不是采购,以避免文件中某些工件的复杂性。它还为我提供了专门处理报价和其他事情的方法。我的主要目的是将'='之后的任何内容保留为文字,甚至是双引号和空格。
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中所示,然后只是为了确保在需要时引用它们。
请记住一些事情。
我喜欢做的另一件事是进行实时查找,避免使用环境变量:
content"
不是最有效的,但较小的文件非常干净。
如果生成变量但未保存到文件中,则无法将它们输入到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
包含变量的脚本可以使用bash导入。考虑一下script-variable.sh
some command | xargs
考虑将使用变量的实际脚本:
#!/bin/sh
scr-var=value
为防止命名冲突,只导入所需的变量:
#!/bin/sh
bash path/to/script-variable.sh
echo "$scr-var"