+ -
当前位置:首页 → 问答吧 → 用 PHP 作为 Shell 脚本语言

用 PHP 作为 Shell 脚本语言

时间:2006-04-16

来源:互联网

[转载请注明作者、译者和出处]
Author: Darrell Brogdon
译: 姜运涛

原文地址:http://www.phpbuilder.com/columns/darrell20000319.php3?page=1

译注:由于本人水平有限,在翻译的过程中难免会有纰漏,如果有什么问题请发邮件与我联系:jiangyuntao#gmail.com。

正如我们大多数人所知,PHP 是当今开发动态网页的最佳语言。但很多人没有意识到用它来做 Shell 脚本也是非常不错的。PHP 作为 Shell 脚本的时候不会像 Bash 或是 Perl 那样在这方面是强项。但如果你像我一样懂 PHP 比 Perl 多一些,那么也将会有一些明显的优势。

使用 PHP 作为 Shell 语言的条件是你必须编译其为二进制的 CGI,而非 Apache 模块。这样做肯定会有一些安全问题,所以请先查阅 PHP 手册。

使用 PHP 作为 Shell 脚本与用其写动态网页在代码上的一点不同,就是你必须要像其他 Shell 一样,先在顶部写这样一段代码:
复制内容到剪贴板
代码:
#!/usr/local/bin/php -q
我们使用 '-q' 是为了屏蔽 PHP 发送的 HTTP 头。当然,你仍需要在脚本的头部和底部使用标准的 PHP 标签:
复制内容到剪贴板
代码:
<?php ?>
现在让我们从经典的 Hello World 例子开始深入研究吧:
复制内容到剪贴板
代码:
#!/usr/local/bin/php -q
<?php
print("Hello World!\n");
?>
如大家所知,我们在屏幕上简单的输出:Hello World!


・向脚本传递参数

通常你可能需要向一个脚本传递参数,在 PHP 中用一个内建的 '$argv' 数组将会很容易实现,如下例如示:
复制内容到剪贴板
代码:
#!/usr/local/bin/php -q
<?php
$first_name = $argv[1];
$last_name  = $argv[2];

print("Hello, $first_name $last_name! How are you today?\n");
?>
在上面的脚本中,我们传递两个将被显示的参数:
引用:
[yc@local yc]$scriptname.php Yeto Chiang
输出:
引用:
Hello, Yeto Chiang! How are you today?
[yc@local yc]$
在使用 PHP 作为 Shell 脚本与做动态网页之间 '$argv' 数组有一个主要的不同点。用作 Shell 脚本时,'$argv[0]' 就是你的脚本名。而做动态网页时,它就是你查询语句的第一个参数。


・让脚本有更强的交互性

我们怎样得到用户的输入呢?我们怎样创建一个真正交互的脚本呢?PHP 本身并没有一个可以读取 Shell 命令的函数,但是我们可以用下面的函数模拟一个:

*注:本函数仅适用于类 Unix 系统
复制内容到剪贴板
代码:
<?php

function read() {
    $fp=fopen("/dev/stdin", "r");//译注:些处推荐用php://stdin,下同。
    $input=fgets($fp, 255);
    fclose($fp);

    return $input;
}

?>
这个函数打开一个标准输入文件的指针 (/dev/stdin on *nix),我们可以用该指针读取任意东西,直到大小达到 255 个字节、新行或是 EOF。这种情况下,最容易因为新行停止读取,然后它会关闭指针并返回数据。

现在我们修改前面的脚本,让其使用刚刚创建的 'read' 函数来等待用户输入:
复制内容到剪贴板
代码:
#!/usr/local/bin/php -q
<?php

function read() {
    $fp=fopen("/dev/stdin", "r");
    $input=fgets($fp, 255);
    fclose($fp);

    return $input;
}

print("What is your first name? ");
$first_name = read();

print("What is your last name? ");
$last_name = read();

print("\nHello, $first_name $last_name!  Nice to meet you!\n");

?>
你可能发现了,当我们执行这个脚本的时候,本应显示成一行的最后一行被分割成三行。这是因为我的们的 'read' 函数同样也读取了新行。这一点很容易修正,只要在返回数据之前去掉新行就行了:
复制内容到剪贴板
代码:
<?php

function read() {
    $fp=fopen("/dev/stdin", "r");
    $input=fgets($fp, 255);
    fclose($fp);

    return str_replace("\n", "", $input);
}

?>
・将 PHP Shell 脚本嵌入正规的 Shell 脚本

有的时候可能需要将 PHP Shell 嵌入到一段已经写好的 Bash 或是其他 Shell 中,这相当容易,但也要小心些。

首先是如何嵌入 PHP 代码:
复制内容到剪贴板
代码:
#!/bin/bash
echo This is the Bash section of the code.

/usr/local/bin/php -q << EOF
<?php
    print("This is the PHP section of the code\n");
?>
EOF
非常简单吧?当你添加一个变量的时候就要小心了,看下面这个代码片断:
复制内容到剪贴板
代码:
#!/bin/bash
echo This is the Bash section of the code.

/usr/local/bin/php -q << EOF
<?php
    $myVar = "PHP";
    print("This is the $myVar section of the code.\n");
?>
EOF
你将会得到一个错误:
引用:
<b>Parse error</b>: parse error in <b>-</b> on line <b>2</b><br>
要修正这个错误,你需要转义代码中所有的 '$' 字符:
复制内容到剪贴板
代码:
#!/bin/bash
echo This is the Bash section of the code.

/usr/local/bin/php -q << EOF
<?php
        \$myVar = "PHP";
        print("This is the \$myVar section of the code.\n");
?>
EOF
现在你可以用 PHP 开始创建自己的 Shell 脚本了。

--Darrell

[ 本帖最后由 姜运涛 于 2006-4-16 15:36 编辑 ]

作者: 姜运涛   发布时间: 2006-04-16

great, you are cool

作者: Per   发布时间: 2006-04-17

昨天翻译完才发现
PHPE早有人译过了
白译了
呵呵

作者: 姜运涛   发布时间: 2006-04-17

多看点总是没错的...只可惜我的本地机上从来都没有以CGI模式运行过..

作者: 帅的不能再输啦   发布时间: 2006-04-17

牛人,我还在努力研究PERL 呢

作者: blackhailang   发布时间: 2006-06-28

顶。。。 好文章。

作者: 小陈   发布时间: 2006-09-07

学习....

作者: lmhllr   发布时间: 2006-09-08

很好的文章。

作者: MySQL   发布时间: 2006-09-08

强,,,,,好好学习一下...

作者: kenus   发布时间: 2006-09-08

爱死phpchina

作者: oodick   发布时间: 2007-08-28

在这里想提个问题^^"
如果PHP拿来当作shell 脚本语言的话,那他会有哪些优势呢   ?

作者: ajneok   发布时间: 2008-02-24

PHP还是把重心放在Web技术上面比较好啊。

作者: luzhou   发布时间: 2008-02-25

作者: ct_174880859   发布时间: 2008-02-27

留个脚印

作者: yuanjing_119   发布时间: 2008-02-28

收藏了 多谢分享

作者: raylzw   发布时间: 2008-03-01

留个脚印,不错,这两天刚好用到了一些这方面的东西,睡醒了来看看!

作者: bluesky56   发布时间: 2008-04-01

以二进制运行时,用作信息处理还是非常不错的。曾经想用它写过一个感染exe文件的程序,虽然能做到,但有点牵强。

作者: carche   发布时间: 2008-04-02

en  不错   收了

作者: jefsun   发布时间: 2008-04-02

呵呵,偶还没到哪个水平哦

作者: 长头发的和尚   发布时间: 2008-04-03

哎...不小的PHP5的编译器啥时候出来,到时候在win下直接编译成exe 用起来也爽点啊!

作者: thaiki   发布时间: 2008-04-03

留名,看看不错

作者: 清竹�w翔   发布时间: 2008-04-03

作者: luzhou   发布时间: 2008-04-04

引用:
原帖由 ajneok 于 2008-2-24 16:11 发表
在这里想提个问题^^"
如果PHP拿来当作shell 脚本语言的话,那他会有哪些优势呢   ?
优势就是
对于我们来说,PHP 更熟悉
当然这不能当做主流
但拿来玩玩还是可以的
就像 PHP-GTK,貌似没有人真的会拿它做项目
如楼上某位仁兄所言,还是把精力放在 WEB 上吧

作者: 姜运涛   发布时间: 2008-04-04

热门下载

更多