2013-12-13 68 views
0

我有一個bash腳本,我寫它打印這些腳本A.grep的只是在bash腳本變量名

例導出的變量名稱另一個腳本B:

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 

但問題是,如果導出不是從行的開始處開始的,即如果開始處有一些空格/製表符,則上述在線行爲不起作用。

任何替代解決方案?

+0

來代替我想在所需輸出的第三行應該是'XYZ'不'FFF'。 – Barmar

+0

@Barmar是的,謝謝我編輯:) –

回答

2
awk '$1 == "export" { split($2, a, "="); print a[1]; }' 
2

溶液用grep:

grep --perl-regexp --only-matching '\s*export\s+([A-Za-z0-9_]+)='

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 

這可能會給ÿ ou一些額外的變量,例如BASH_LINENO

+0

這很好:)。這是我想要做的。我如何才能比較a.sh中的變量(不是在a.sh中新添加的變量) –

+0

@JeshwanthKumarNK,更新了答案 – perreal

1
sed -n '/^[[:blank:]]*export[[:blank:]]*\([^=]\{1,\}\)=.*/ s//\1/p' ScriptA 

[[:blank:]]可以通過一個簡單的空間在大多數的情況下