我在脚本中使用了很多外部文件。
但我有一个问题,如果我将文件exit
内容作为源文件,脚本将退出加载,并且我想要使用的字符串就会消失。
例子main.sh
:
#!/bin/bash
clear;
source /opt/external-svn/config.sh;
echo "$var1 and $var2 and $var3";
例子config.sh
:
#!/bin/bash
var1="foo bar is great"
var2="foooo baar is greater"
var3="foooooooo baaaaaar is \
to long"
exit 0
问题是多行var3
,所以我想使用var1
and的源代码var2
。以下是可能的,但不太好:
var1=$(cat "/opt/external-svn/config.sh" |awk -F'"' '/^var1/ {print $2}');
这仅适用于单行,不适用于var3
.
有一个简单/容易的解决方案吗?
更新,因为我太蠢了,无法做出正确的答案
@Gilles 没有在原始文件中工作,在这里寻求建议 raw.githubusercontent.com/gorgone/temptest/master/config.sh
#!/bin/bash
FILE="/tmp/$(basename $0).$$.tmp"
configsh="/opt/external-svn/config.sh"
grep -vE '^exit' $configsh > $TFILE
source "$TFILE"
退出主脚本并在屏幕上显示回显
@Anthon 它也不适用于我在 github 上的文件
Update2找到解决方案
我发现了一个神奇的方法,我使用了这个想法,但它不是一个通用的解决方案
只针对我的特殊情况
cat config.sh |sed 's/if [ $# = 0 ]/if [ $# = 1 ]/g' >config.source
这样我就可以获取该文件的来源
但最好的方法是为所有文件提供通用解决方案
答案1
您可以通过在 的开头声明自定义函数来覆盖exit
您的.main.sh
exit
main.sh
#!/bin/bash
# main.sh
exit() {
local exit_code="${1-?}"
test "$exit_code" -ne 0 && builtin exit "$exit_code"
:
}
clear;
source /opt/external-svn/config.sh;
echo "$var1 and $var2 and $var3";
#unset -f exit; exit 0
builtin exit 0
答案2
如果你有abc.inc
:
x=1
exit 0
和klm.inc
:
y=2
exit 0
那么如果你有combine
脚本:
#!/bin/bash
for fn in abc klm; do
grep -vE '^exit' $fn.inc > /tmp/xyz.tmp
source /tmp/xyz.tmp
done
echo x: $x
echo y: $y
您可以运行combine
并获取输出:
x: 1
y: 2
这假设您的exit
语句位于其行的开头,grep
如果不是,您可能需要调整