我想调用变量的设置文件,如何在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等......?
答案 0 :(得分:196)
使用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
在命令行。所有脚本都可以访问此值。
答案 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
答案 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)));