LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1220|回复: 5

PHP 也可以当成 Shell Script 使用

[复制链接]
发表于 2007-3-26 16:50:37 | 显示全部楼层 |阅读模式
已经排版好的文档请您看这个链接: http://www.gracecode.com/article ... %E4%BD%BF%E7%94%A8/

日期:2007-02-06 作者:dbonline.cn 来自:linux.chinaunix.net

PHP 执行档的安装

一般 PHP 作为网页处理语言都是要编译成 Apache 的模块﹐这里当然不么做﹐也因此编译起来很简单﹐只要以 root 的身分进行如下动作:

解开 php-3.0.xx.tar.gz

cd php

configure

make

编译完之后﹐在 php 目录下有一个可执行档﹐档名为 php﹐将它 copy 到 /usr/local/bin 下即可。注意﹐如果档案太大﹐可以使用 strip 指令将 php 的方式将不必要的信息去除﹐这样档案就会小得多了。
第一个程序

开始撰写我们的第一个 PHP Shell Script 程序﹐这个例子印出 "Hello world !" :
<?php
#!/usr/local/bin/php -q
echo "Hello, world !";
?>

注意到 PHP 原本是应用在网页应用的﹐因此它内定会送出 HTML 的 HEADER﹐但是在此我们是要将 PHP 用作 Shell Script﹐ "-q" 就是表示不要送出 HEADER 的意思﹐你可以试试看不加上 -q 的显示结果。

在这个例子中﹐/usr/local/bin/php 是表示要执行 /usr/local/bin/ 下的 PHP﹐因为我们刚才将它装在该处。echo 指令将 "Hello, world !" 印出﹐其 中的 "" 字符是换行字符。

注意到在将这个程序存成档案后﹐须将其 chmod 成为可执行属性(chmod +x 文件名)﹐然后才能执行喔。
进阶使用 I

有时候我们需要在程序执行时﹐送进一些参数﹐比如说 ls 这个指令﹐后面可以加上 -l 参数﹐PHP Shell Script 一样也有支持这样的用法﹐有两个特殊 的变量 : $argc 记录着后面送入参数的个数﹐$argv[] 数组参数存着的则是参数的内容。比如说我现在要设计一个算两个数字总和的程序 :
<?php
#!/usr/local/bin/php -q
$sum=0;
$sum=$sum + $argv[1] + $argv[2];
echo $sum;
?>

假设将此程序命名为 sum.php3﹐则执行 sum.php3 1 2 按下 enter 则会印出 3。

如果要算出不特定个数的参数和﹐那么就得要用到 $argc 这个特殊变量了 :
<?php
#!/usr/local/bin/php -q

$sum=0;

for ($t=1; $t<=$argc; $t++) {
    $sum=$sum+$argv[$t];
}

echo $sum;
?>

假设将此程序命名为 bigsum.php3﹐则执行 bigsum.php3 1 2 3 4 5 按下 enter 则会印出 15﹐执行 bigsum.php3 1 2 3 4 5 6 按下 enter 则会印出 21。

有时候我们需要在程序执行中输入资料﹐但是 PHP 原本就是用于网页设计﹐而网页上的资料输入自然都是用 FORM 的方式来输入﹐所以这将 PHP 作为 Shell Script 时问题就来了﹐好在 PHP 有提供了开文件功能﹐而在 Linux/Uinx 之下﹐输入(input)这件事原本就可以用开档的方式来完成﹐我们要开启的是 /dev/stdin 这个设备档(stdin 是表示 standard input 的意思)﹐程序如下 :
<?php
#!/usr/local/bin/php -q

$fp = fopen("/dev/stdin","r");
$inputstr = fgets($fp,100);
fclose($fp);
echo $inputstr;

?>

其中的 fgets($fp,100) 是指从 $fp 这个档案(也就是 "/dev/stdin")中读取出 100 个 byte 的资料﹐程序执行到这行便会停下来等待我们的输入﹐当我们输入完按下 enter 之后﹐程序就会将刚才我们输入的资料给印出来了。
进阶使用 II

虽然已经可以处理输入﹐但是这样的功能显然还是太简单﹐无法应付更大的应用﹐比如说我需要一个功能是将一串资料流(data stream)中的 HTML 给去 除﹐这时便需要完整地处理输出输入转向的能力﹐我们可以先设计程序如下 :
<?php
#!/usr/local/bin/php -q

$fp=fopen("/dev/stdin","r");

while(!feof($fp)) {
   $c=fgetc($fp);
   $inputstr=$inputstr.$c;
};

fclose($fp);
echo $inputstr;
?>

假设将此程序命名为 filt.php3﹐如果你直接执行这个程序﹐它会一直等待你输入﹐直到你按下 Ctrl+D 后才会将你的输入资料给印出﹐我们可以这么执行它 :
more filt.php3 | filt.php3

这样的做法是将 filt.php3 这个程序用 more 给秀出并转向给 filt.php3 这个程序﹐filt.php3 会不断接受资料(事实上就是 filt.php3 程序代码本身)﹐最后将其印出。

我们可以在其中加上过滤 HTML 的功能 :
<?php
#!/usr/local/bin/php -q

$fp = fopen("/dev/stdin","r");

while(!feof($fp)) {
   $c = fgetc($fp);
   $inputstr = $inputstr.$c;
};

   fclose($fp);
   $inputstr = ereg_replace("<([^<>]*)>","",$inputstr);
   echo $inputstr;
?>

假设将此程序命名为 filt2.php3﹐如此一来便完成了过滤功能﹐不信请拿个 HTML 档来试试看 :
more xxx.html | filt2.php3

你便会看到删除了 HTML TAG 的文件了。
发表于 2007-3-30 17:05:00 | 显示全部楼层
我写过个十几K的脚本....用来把邮件转换成数据库的,原码似乎还在呢...



SHELL is fun, Learn to play.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-1 22:11:59 | 显示全部楼层
Post by nbxmedia
我写过个十几K的脚本....用来把邮件转换成数据库的,原码似乎还在呢...



SHELL is fun, Learn to play.


一时找不到 NB 兄弟的网站了,最近在哪里“定居”了的说? :%
回复 支持 反对

使用道具 举报

发表于 2007-4-20 19:29:50 | 显示全部楼层

学习了,php 真的很强大

不错的 ,我一直在学习这方面的东西。以前用c写过一个远程的shell,不知道丢哪了。上次主板电容坏了 ,改了一下,结果全部都变化了。
回复 支持 反对

使用道具 举报

发表于 2007-4-23 21:56:00 | 显示全部楼层
貌似我也翻译过这类文章
回复 支持 反对

使用道具 举报

发表于 2007-5-19 00:37:29 | 显示全部楼层
用这样的方式即可执行任意脚本。
php xxx.php

不需要修改脚本自身,可以直接把原本的web程序拿来用
当然参数是$_SERVER['argv'][...] 而不能是原来的$_GET[...] $_POST[..]之类
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表