2014-04-03 3 views
1

PHP 스크립트를 사용하기 위해 bash 스크립트를 작성했습니다. bash 스크립트는 PHP 스크립트에 대한 인수 목록을 만듭니다 (bash 스크립트의 인수를 PHP 스크립트에 전달하는 것과 반대 됨)bash 스크립트 내에서 PHP getopt

bash 스크립트에서 생성 된 인수 행을 사용하여 PHP 스크립트를 직접 호출하면 .! 여기

#!/bin/sh 

export PROFILE=$1 
export TS_FILE=$2 

if [ ! -z $PROFILE ] && [ -e $PROFILE ]; then 
    source $PROFILE 
else 
    source default_profile 
fi 

if [ ! -z $TS_FILE ] && [ -e $TS_FILE ]; then 
    source $TS_FILE 
else 
    source default_ts 
fi 

# create args for php script 

ARGS_PHP="--agent \"$AGENT\" --sig \"$SIG_FILE\" --cie \"$CMPGY\" --super \"$SUPERVISOR\" --type \"$WRK_TYPE\" -d $DATES" 

for nb_days in $(seq 0 $((DATES-1))); do 
    ARGS_PHP="$ARGS_PHP --date ${DATE_DATE[$nb_days]} --label \"${DATE_LABEL[$nb_days]}\" --as ${DATE_START[$i]} --pe ${DATE_END[$i]} --dt ${DATE_TOTAL[$i]}" 
done 

#echo ./script.php "$ARGS_PHP" 
./script.php $ARGS_PHP 

과 미세한 Howhever, bash는 스크립트가 스크립트에서 같은 줄을 실행하려고 할 때, (PHP) getopt에 실패 여기

이 bash는 스크립트를 작동 getopt는 (PHP) PHP 스크립트 :

내가 의도 한대로 bash는 스크립트를 실행하면 9,285,273,210

, 내가 얻을 :

array(1) { 
    ["agent"]=> 
    string(5) ""Name" 
} 

나는 "에코"행의 주석을 해제하고 PHP 스크립트 호출을 언급, 내가 얻을 :

./script.php --agent "Name Surname" --sig "../../path/sig.png" --cie "Cie Name" --super "Name Surname" --type "String" -d 5 --date 2014-03-31 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-01 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-02 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-03 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-04 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 

나는 경우, 그 줄을 실행, 내가 얻을 :

array(11) { 
    ["agent"]=> 
    string(12) "Name Surname" 
    ["sig"]=> 
    string(18) "../../path/sig.png" 
    ["cie"]=> 
    string(8) "Cie Name" 
    ["super"]=> 
    string(12) "Name Surname" 
    ["type"]=> 
    string(6) "String" 
    ["d"]=> 
    string(1) "5" 
    ["date"]=> 
    array(5) { 
    [0]=> 
    string(10) "2014-03-31" 
    [1]=> 
    string(10) "2014-04-01" 
    [2]=> 
    string(10) "2014-04-02" 
    [3]=> 
    string(10) "2014-04-03" 
    [4]=> 
    string(10) "2014-04-04" 
    } 
    ["label"]=> 
    array(5) { 
    [0]=> 
    string(16) "Some label Value" 
    [1]=> 
    string(16) "Some label Value" 
    [2]=> 
    string(16) "Some label Value" 
    [3]=> 
    string(16) "Some label Value" 
    [4]=> 
    string(16) "Some label Value" 
    } 
    ["as"]=> 
    array(5) { 
    [0]=> 
    string(4) "9:00" 
    [1]=> 
    string(4) "9:00" 
    [2]=> 
    string(4) "9:00" 
    [3]=> 
    string(4) "9:00" 
    [4]=> 
    string(4) "9:00" 
    } 
    ["pe"]=> 
    array(5) { 
    [0]=> 
    string(5) "17:00" 
    [1]=> 
    string(5) "17:00" 
    [2]=> 
    string(5) "17:00" 
    [3]=> 
    string(5) "17:00" 
    [4]=> 
    string(5) "17:00" 
    } 
    ["dt"]=> 
    array(5) { 
    [0]=> 
    string(4) "7:30" 
    [1]=> 
    string(4) "7:30" 
    [2]=> 
    string(4) "7:30" 
    [3]=> 
    string(4) "7:30" 
    [4]=> 
    string(4) "7:30" 
    } 
} 

나는 var_dump($options)을 언급하고 var_dump($argv) 내가 일 수 주석을 해제하는 경우 e는 bash 스크립트에서와 같이 명령 줄에서 PHP 스크립트와 동일한 동작을합니다. 어느 것이 $ ARGS_PHP bash 변수의 모든 (하위) 단어의 배열입니다. 내가 "$ARGS_PHP"을 인용하는 경우

, 내가 얻을 :

array(0) { 
} 

형태 $argv

array(2) { 
    [0]=> 
    string(16) "./script.php" 
    [1]=> 
    string(490) "--agent "Name Surname" --sig "../../path/sig.png" --cie "Cie Name" --super "Name Surname" --type "String" -d 5 --date 2014-03-31 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-01 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-02 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-03 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30 --date 2014-04-04 --label "Some label Value" --as 9:00 --pe 17:00 --dt 7:30" 
} 

$options

. bash 스크립트에서 시작할 때 getopt를 제대로 사용하도록 PHP 스크립트를 얻으려면 어떻게해야합니까?!?!?!

PS :

DEFAULT_PROFILE :

export AGENT="Name Surname" 
export SIG_FILE="../../path/sig.png" 

default_ts :

#!/bin/sh 
# default dummy values for TS (testing purposes) 

# date solver. Default fills current week TS starting monday to friday 
CURRENT=$(date +%u) 
DOW=("monday" "tuesday" "wednesday" "thursday" "friday") 

function solve_date(){ 

    THIS_DOW=$1 

    if [ $CURRENT -eq $THIS_DOW ];then 
    date +%F 
    elif [ $CURRENT -gt $1 ];then 
    date --date "last ${DOW[$((THIS_DOW-1))]}" +%F 
    else 
    date --date "next ${DOW[$((THIS_DOW-1))]}" +%F 
    fi 

} 

export DATES=$((5)) 
export CMPGY="Cie Name" 
export SUPERVISOR="Name Surname" 
export WRK_TYPE="String" 

DATE_DATE[0]=$(solve_date 1) 
DATE_LABEL[0]="Some label Value" 
DATE_START[0]="9:00" 
DATE_END[0]="17:00" 
DATE_TOTAL[0]="7:30" 

DATE_DATE[1]=$(solve_date 2) 
DATE_LABEL[1]="Some label Value" 
DATE_START[1]="9:00" 
DATE_END[1]="17:00" 
DATE_TOTAL[1]="7:30" 

DATE_DATE[2]=$(solve_date 3) 
DATE_LABEL[2]="Some label Value" 
DATE_START[2]="9:00" 
DATE_END[2]="17:00" 
DATE_TOTAL[2]="7:30" 

DATE_DATE[3]=$(solve_date 4) 
DATE_LABEL[3]="Some label Value" 
DATE_START[3]="9:00" 
DATE_END[3]="17:00" 
DATE_TOTAL[3]="7:30" 

DATE_DATE[4]=$(solve_date 5) 
DATE_LABEL[4]="Some label Value" 
DATE_START[4]="9:00" 
DATE_END[4]="17:00" 
DATE_TOTAL[4]="7:30" 

export DATE_DATE 
export DATE_LABEL 
export DATE_START 
export DATE_END 
export DATE_TOTAL 

답변

1

인수 목록이 모두 하나의 문자열에 포함되어 있기 때문에, bash는 같이 PHP의 전체 문자열을 전달한다 단일 인수가 있으면 PHP는이를 공백으로 분할합니다. 해결하는 가장 쉬운 방법은 다음과 같이 호출하는 것입니다 : 의도 한대로

bash -c "php script.php $ARGS_PHP"

PHP는 다음 인수의 문자열을 평가할 수 있습니다.

+0

그게 효과가 있습니다. 감사! – Sebastien

관련 문제