2015-06-18 32 views
2

我哈瓦在數據庫中的列,其包含以下數據:如何在shell腳本中擴展變量?

sql_proc|test_sql.sql|/home/Desktop/myfile.txt|$IMP_FILES/myFolder|convert 

我已取入的變量這一點,我已經使用了cut命令"|"作爲分隔符和在一個不同的變量保存的每個字段。現在讓我們考慮VAR4持有第4場,即$IMP_FILES/myFolder$IMP_FILES是一個值爲/home/OffFiles/Module的環境變量。

如何獲得/home/OffFiles/Module/myFolder

+1

@JohnSmith沒有那個不同。 op需要'path = \'bash -c「echo'$ var4'」\''或'path = \'eval echo $ var4 \'' – HuStmpHrrr

+1

環境變量名是固定的還是會變化的 - 它總是'$ IMP_FILES'或者可以是其他行中的'$ HOME'和'$ UMBRELLA'等。 –

+0

@JohnSmith謝謝,那個線程幫助。並感謝大家的幫助,我決定使用eval它對我有用。 –

回答

0

使用bash -c

newvar="$(bash -c "echo $var")" 

eval使用:

newvar="$(eval "echo $var")" 

實施例:

#!/bin/bash 
var='$PATH' 
echo "$var" #This will show that $var contains the string $PATH literally 

#Using bash -c 
newvar="$(bash -c "echo "$var"")" 
echo "$newvar" 

#using eval 
newvar="$(eval "echo "$var"")" 
echo "$newvar" 

它將打印該環境變量路徑兩次。

0

的不安全的解決方案是使用eval

eval echo "$VAR4" 

不這樣做,不過,想象當VAR4='|rm -rf /'會發生什麼!您可以使用關聯數組而不是環境變量。

#!/bin/bash 
declare -A dict 
dict[IMP_FILES]=/home/OffFiles/Module 
# ... 

VAR4='$IMP_FILES/myFolder' 
while [[ $VAR4 =~ \$([_A-Z]+) ]] ; do 
    key=${BASH_REMATCH[1]} 
    VAR4=${VAR4/\$$key/${dict[$key]}} 
done 
echo "$VAR4" 

請注意,解決方案是遞歸的,即如果字典包含值中的鍵,它可以無限增長字符串。我會放棄shell並轉向Perl,它可以更輕鬆地處理類似的問題。

+0

使用bash本身聽起來足夠安全。 'bash -c「echo」| echo abc'「'誠實地打印文本。 – HuStmpHrrr

+0

@HuStmpHrrr:好的,試試'VAR4 = \'\ | rm \ -rf \/\'' – choroba