2010-12-08 361 views
2

我通過bash shell使用PHP CLI。詳情請查詢Manipulating an array (printed by php-cli) in shell script在bash shell腳本中啓動動態變量(變量變量)

在下面的shell代碼中,我能夠回顯我從PHP腳本獲得的key - value對。

IFS=":" 

# parse php script output by read command 
php $PWD'/test.php' | while read -r key val; do 
    echo $key":"$val 
done 

以下是輸出這一點 -

BASE_PATH:/path/to/project/root 
db_host:localhost 
db_name:database 
db_user:root 
db_pass:root 

現在我只想啓動while循環中的動態變量,這樣我可以像$BASE_PATH具有價值'/path/to/project/root'$db_host有使用它們'localhost'

我來自PHP的背景。我想類似PHP

$$key = $val

回答

3

您可以嘗試使用eval結構中BASH

key="BASE_PATH" 
value="/path/to/project/root" 
# Assign $value to variable named "BASE_PATH" 
eval ${key}="${value}" 

# Now you have the variable named BASE_PATH you want 
# This will get you output "/path/to/project/root" 
echo $BASE_PATH 

然後,就用它在你的循環。


編輯:這個讀循環創建一個子shell,不會讓你使用它們的循環之外。你可能會重構讀循環,這樣不創建子shell:

# get the PHP output to a variable 
php_output=`php test.php` 

# parse the variable in a loop without creating a sub-shell 
IFS=":" 
while read -r key val; do 
    eval ${key}="${val}" 
done <<< "$php_output" 

echo $BASE_PATH 
+0

@Martin謝謝,這有效,但在while循環之外有可變範圍問題。我能夠在循環內的eval行後面回顯變量,但不在「while」循環的`done`關鍵字之外 – 2010-12-08 07:54:25

+0

您是對的,這是因爲read構造創建了一個子外殼。然後內部變量在循環之外將不可見。我會更新與替代解決方案的答案... – 2010-12-08 08:10:39

4

使用eval介紹必須考慮的安全隱患。它的安全使用declare

# parse php script output by read command 
while IFS=: read -r key val; do 
    echo $key":"$val 
    declare $key=$val 
done < <(php $PWD'/test.php') 

如果你正在使用bash 4,可以使用關聯數組:

declare -A some_array 
# parse php script output by read command 
while IFS=: read -r key val; do 
    echo $key":"$val 
    some_array[$key]=$val 
done < <(php $PWD'/test.php') 

使用過程substition <()並重定向到while循環done防止創建的子殼。僅爲read命令設置IFS可消除保存和恢復其值的需要。