2017-08-24 77 views
-1

值在bash殼我有打印變量名稱和諸如值的命令:提取變量從命令輸出bash外殼

Hello mate this is you variables: 
MY_VAR1= this is the value of the first var 
MY_VAR2= subvar1=27, subvar2=hello1 
Have a good day! 

在輸出變量的值可以包含字符=,逗號; ...:,但我期望在每個變量值的末尾找到新行。
我需要創建一個簡短的腳本來讀取MY_VAR1和MY_VAR2的值。
所以我需要有2個變量落得如下:

MY_VAR1 = this is the value of the first var 
MY_VAR2 = subvar1=27, subvar2=hello1 

我的CentOS 7的基本安裝,我不能在這臺機器上安裝額外的東西。
我該如何實現它?

+0

目前還不清楚是什麼你想在這裏做。你能用一個具有實際價值的例子來解釋更多,並告訴我們嗎? – Inian

+0

剛剛編輯了問題,現在有意義,我有一個命令輸出(它可以看作是一個字符串)某些變量的名稱,我必須讀取這些值,變量的值可以包含特殊字符作爲'=',分隔符是新行。 – daniele

回答

0

我假設變量名稱是從行首開始到=的符號(除外),前導和尾隨空白被刪除(變量名中不能有空格)。

如果你想要的是你打印顯示輸出,你可以使用類似:

while read line; do 
    if [[ $line =~ ^[[:blank:]]*([^[:blank:]]+)[[:blank:]]*=(.*)$ ]]; then 
     var="${BASH_REMATCH[1]}" 
     val="${BASH_REMATCH[2]}" 
     echo "$var = $val" 
    fi 
done < <(my_command) 

=~操作與正則表達式匹配的模式。正則表達式^[[:blank:]]*([^[:blank:]]+)[[:blank:]]*=(.*)$使用變量賦值模擬命令的輸出行。即使變量名稱被空白包圍,它也會匹配。兩個子表達式(包含在()中)是隔離的:變量名稱和值。 BASH_REMATCH數組包含分別與單元格1和2中的子表達式匹配的模式。

如果你也想將變量分配:

while read line; do 
    if [[ $line =~ ^[[:blank:]]*([^[:blank:]]+)[[:blank:]]*=(.*)$ ]]; then 
     var="${BASH_REMATCH[1]}" 
     val="${BASH_REMATCH[2]}" 
     echo "$var = $val" 
     declare $var="$val" 
    fi 
done < <(my_command)