2014-09-02 21 views
0

我試圖從shell到PHP再次傳遞參數。在我的簡單測試中,我很容易從shell到PHP,但沒有運氣讓字符串退出。我試過escapeshellarg和escapeshellcmd,但都沒有成功。在PHP和shell之間來回傳遞參數

殼牌

#!/bin/sh 

# set a date and time variables, in the form of YYYY-MM-DD and HH:MM:SS 
dateVar=`date +%Y-%m-%d` 
timeVar=`date +%H_%M` 

# Launching PHP 
runPHP=`which php` 
$runPHP calledPHP.php $timeVar $dateVar 

# Returned from PHP 
passTime=$1 
echo "$passTime" 

passDate=$2 
echo "$passDate" 

PHP

<?php 

setlocale(LC_CTYPE, "en_US.UTF-8"); 
echo "PHP called.\n"; 
$logTime = $argv[1]."\n"; 
// echo $logTime; 
$logDate = $argv[2]."\n"; 
// echo $logDate; 

$passTime = escapeshellarg('Time: $logTime'); 
$passDate = escapeshellarg('Date: '.$logDate); 

?> 

運行外殼,只能隨聲附和,它得到的回覆是 'PHP調用。'正如你所看到的,我已經在最後兩個php變量中嘗試了兩種不同的語法。這兩者似乎都不起作用。有更好的功能嗎?或者,我只是使用錯誤的語法?

在此先感謝您的任何建議

+0

你的PHP代碼做除了你的一個'PHP called'回聲正常輸出。你的'$ logTime'行不正確。 PHP中的引號字符串不會內插變量。你的'$ passTime'將從字面上包含'$','l','o','g'等等。 – 2014-09-02 20:22:02

+0

我最初找到'$ passDate'的例子,這對我來說看起來是正確的,但我同意''''引用的字符串。我只是爲了完整性而嘗試,因爲這是我發現的一個「工作示例」,儘管它顯然不適合我。我並沒有真正想從PHP獲得任何輸出,除了將一個字符串從PHP傳回到包含shell的腳本之外。 – LOlliffe 2014-09-02 20:37:11

回答

1

在PHP腳本,你會必須要echo任何你希望shell腳本獲得「返回值」的東西。請記住,你並沒有真正返回任何東西。您正在打印到標準輸出。 然後,您必須使用someVariable=$(ExecuteScriptThatOutputsStdOut)將該stdOut捕獲到shell腳本中的變量中。

下面是一個類似的提問/回答:redirect command output into variable and standard output in ksh

下面是修改代碼以獲取/打印從PHP腳本的輸出。 還有一些你可能想要改變的奇怪之處,儘管這是一個單獨的問題。 (在php中分配結束時的換行符,使用其中的硬編碼標籤轉義的shell參數)。

如果您需要單獨的日期和時間,則必須調用兩個單獨的PHP腳本,或者,在shell腳本中,您必須解析PHP腳本的輸出並將結果分離爲兩個變量。

Shell腳本

#!/bin/sh 

# set a date and time variables, in the form of YYYY-MM-DD and HH:MM:SS 
dateVar=`date +%Y-%m-%d` 
timeVar=`date +%H_%M` 

# Launching PHP 
runPHP=`which php` 
phpResult=$($runPHP calledPHP.php $timeVar $dateVar) 

# Returned from PHP 
echo "The php result is: $phpResult" 

PHP

<?php 

setlocale(LC_CTYPE, "en_US.UTF-8"); 
//echo "PHP called.\n"; 
$logTime = $argv[1]."\n"; 
// echo $logTime; 
$logDate = $argv[2]."\n"; 
// echo $logDate; 

$passTime = escapeshellarg("Time: $logTime"); 
$passDate = escapeshellarg("Date: $logDate"); 

echo "$passTime, $passDate"; 
?> 
+0

非常感謝您的幫助。我完全不理解我發現的例子是如何工作的。我沒有看到PHP是如何傳遞參數給$ 1和$ 2變量的。你的例子更有意義。對於這個例子可能會有幫助的人來說,最後的shell echo會顯示這個變量:'php的結果是:'Time:17_36','Date:2014-09-02',所以如果你只是想原始時間或日期,你需要進一步處理它,但現在至少你知道如何獲得一些數據來處理。 – LOlliffe 2014-09-03 00:54:53

0

當一個shell腳本調用外部程序,它可以捕捉的唯一事情是程序的輸出。程序的狀態(環境,變量等)在程序進程退出時全部消失。

你必須安排將你的PHP腳本發出數據到標準輸出(即echo吧)和shell腳本解析輸出(通常與read命令)