我有一个bash脚本A,我正在编写另一个脚本B,它打印出在脚本A中导出的变量名。
示例:
export A=TRUE
export ABC="GFT"
export XYZ="FFF"
\# export P="SSD"
如果我执行脚本A,它必须提供如下输出:
A
ABC
XYZ
我试过这个oneline:
grep export file.env | grep -v "#" | cut -d' ' -f2 | cut -d'=' -f1
但问题是,如果导出不是从行的开头开始,即如果开头有一些空格/ Tab,则上述在线不起作用。
对此有任何替代解决方案吗?
答案 0 :(得分:2)
awk '$1 == "export" { split($2, a, "="); print a[1]; }'
答案 1 :(得分:2)
使用grep的解决方案:
grep --perl-regexp --only-matching '\s*export\s+([A-Za-z0-9_]+)='
答案 2 :(得分:1)
b.sh
:
printenv > TMP
. ./a.sh
printenv | diff TMP - | grep -v printenv | sed -n 's/> *\([^ =]*\)=.*/\1/p'
或者获得更改:
set > TMP
. ./a.sh
set | grep -vf - TMP | cut -d= -f1
这可能会为您提供一些额外的变量,例如BASH_LINENO
。
答案 3 :(得分:1)
sed -n '/^[[:blank:]]*export[[:blank:]]*\([^=]\{1,\}\)=.*/ s//\1/p' ScriptA
在大多数情况下, [[:blank:]]
可以用简单的空格替换