繁体   English   中英

bash脚本中的php getopt

[英]php getopt within bash script

我写了一个bash脚本来使用php脚本。 bash脚本为php脚本创建了一个参数列表(与将bash脚本的参数简单地传递到php脚本相反)。

我的问题是,如果我直接使用bash脚本生成的参数行调用php脚本,则(php)getopt可以正常工作。 但是,当bash脚本尝试从脚本内执行同一行时,(php)getopt失败!

这是bash脚本:

#!/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

这是PHP脚本:

#!/usr/bin/php

<?php
$shortopts  = "";
$shortopts .= "d:";  // Required value

$longopts  = array(
    "agent:",     // Required value
    "sig:",     // Required value
    "cie:",     // Required value
    "super:",     // Required value
    "type:",     // Required value
    "date:",     // Required value
    "label:",     // Required value
    "as:",     // Required value
    "pe:",     // Required value
    "dt:",     // Required value
);

$options = getopt($shortopts, $longopts);

var_dump($options);
//var_dump($argv);

?>

如果我按预期执行bash脚本,则会得到:

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

如果取消注释“ echo”行并注释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) ,则从命令行的php脚本得到的行为与从bash脚本得到的行为相同。 这是$ ARGS_PHP bash变量中所有(子)字的数组。

如果引用"$ARGS_PHP""$ARGS_PHP"得到:

array(0) {
}

$options

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"
}

形成$argv 从bash脚本启动时,如何使php脚本正确使用getopt?!?!?!

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

因为您的参数列表全部包含在单个字符串中,所以bash将整个字符串作为单个参数传递给php,然后PHP将其拆分到一个空格中。 最简单的修复方法是这样调用:

bash -c "php script.php $ARGS_PHP"

然后,PHP可以按预期求值参数字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM