2010-12-08 8 views
2

bash 쉘을 통해 PHP CLI를 사용하고 있습니다. 자세한 내용은 Manipulating an array (printed by php-cli) in shell script을 확인하십시오.bash 쉘 스크립트에서 동적 변수 (가변 변수) 시작

다음 쉘 코드에서 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 

지금 난 그냥 내가 가진 값 '/path/to/project/root', $db_host을 가진 $BASE_PATH처럼 사용할 수 있도록 while 루프 내부에 동적 변수를 초기화 할 'localhost'

PHP 배경에서 왔습니다. 당신의 루프에서 사용, 그리고

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 

: 나는 PHP

$$key = $val

답변

3

당신은 BASHeval 구조를 사용하려고 할 수 있습니다 뭔가를하고 싶습니다.


편집 :이 읽기 루프 당신이 루프의 외부에서이를 사용하도록 허용하지 않습니다 하위 쉘을 만듭니다. 서브 쉘이 생성되지 않도록 당신은 읽기 루프를 재구성 할 수 있습니다

# 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 루프 외부 변수 범위 문제가 있습니다. 루프 내에서 평가 라인 바로 다음에 변수를 에코 할 수 있지만 while 루프의'done' 키워드 바깥에는 들어갈 수 없습니다. –

+0

읽기 구조가 하위 쉘을 생성 했으므로 맞습니다. 그런 다음 내부 변수가 루프 외부에 표시되지 않습니다. 대체 솔루션으로 답변을 업데이트하겠습니다 ... –

+0

죄송합니다. 이렇게 작동하지 않습니다. 만약'while '을'php' 명령에서 분리한다면 (while'php $ PWD'/ test.php '| read -r key val; do'), while 루프는 한 번만 실행되고' $ key'와'$ val'은 비어 있습니다. –

4

eval이 고려되어야한다 보안 위험을 도입하여. 당신은 배쉬 4를 사용하는 경우, 당신은 연관 배열 사용할 수 있습니다

# 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') 

: 그것은 declare 사용하는 것이 더 안전 프로세스 substition <()를 사용하고 while 루프의 done로 리디렉션

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') 

을 생성을 방지 서브 쉘의 read 명령에 대해서만 IFS를 설정하면 값을 저장하고 복원 할 필요가 없습니다.

+0

팁 주셔서 감사하지만 귀하의 솔루션 중 하나를 사용하여, 내 스크립트는 아무것도 실행하지 않고 ('done <(php $ PWD '/ test.php') 부분으로 인해) 죽지 않습니다. 나는 while 조건 전에 "echo"를 넣으려고했고 루프 뒤에서 "read simply"다음에'echo "를 시도했다. 그러나 아무 것도 울리지 않고 스크립트는 사용자 입력을 요구하지 않습니다. –

+0

@Sandeepan Nath : 제 예제는 Martin의 두 번째 예제와 비슷하게 작동합니다. 저것이 너를 위해 그 후에 작동하는 경우에, 나의 것은 또한 잘해야한다. 테스트 echo 문이 아무 것도하지 않는다는 것은 말이되지 않습니다. 리디렉션 된 프로세스 대체가 스크립트가 죽는 원인을 이해할 수 없습니다. –

+1

선언을 보여 주면 +1 할 수 있습니다! 굉장히 유용하다. –