• 用 PHP 作为 Shell 脚本语言


    [转载请注明作者、译者和出处]
    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 一样,先在顶部写这样一段代码:

    1.  #!/usr/local/bin/php -q

    我们使用 '-q' 是为了屏蔽 PHP 发送的 HTTP 头。当然,你仍需要在脚本的头部和底部使用标准的 PHP 标签:

    1.  <?php ?>

    现在让我们从经典的 Hello World 例子开始深入研究吧:

    1.  #!/usr/local/bin/php -q

    2.  <?php

    3.  print("Hello World!\n");

    4.  ?>

    如大家所知,我们在屏幕上简单的输出:Hello World!


    ·向脚本传递参数

    通常你可能需要向一个脚本传递参数,在 PHP 中用一个内建的 '$argv' 数组将会很容易实现,如下例如示:

    1.  #!/usr/local/bin/php -q

    2.  <?php

    3.  $first_name = $argv[1];

    4.  $last_name  = $argv[2];

    5.   

    6.  print("Hello, $first_name $last_name! How are you today?\n");

    7.  ?>

    在上面的脚本中,我们传递两个将被显示的参数:

    [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
    系统

    1.  <?php

    2.   

    3.  function read() {

    4.      $fp=fopen("/dev/stdin", "r");//译注:些处推荐用php://stdin,下同。

    5.      $input=fgets($fp, 255);

    6.      fclose($fp);

    7.   

    8.      return $input;

    9.  }

    10.  

    11. ?>

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

    现在我们修改前面的脚本,让其使用刚刚创建的 'read' 函数来等待用户输入:

    1.  #!/usr/local/bin/php -q

    2.  <?php

    3.   

    4.  function read() {

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

    6.      $input=fgets($fp, 255);

    7.      fclose($fp);

    8.   

    9.      return $input;

    10. }

    11.  

    12. print("What is your first name? ");

    13. $first_name = read();

    14.  

    15. print("What is your last name? ");

    16. $last_name = read();

    17.  

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

    19.  

    20. ?>

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

    1.  <?php

    2.   

    3.  function read() {

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

    5.      $input=fgets($fp, 255);

    6.      fclose($fp);

    7.   

    8.      return str_replace("\n", "", $input);

    9.  }

    10.  

    11. ?>

    · PHP Shell 脚本嵌入正规的 Shell 脚本

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

    首先是如何嵌入 PHP 代码:

    1.  #!/bin/bash

    2.  echo This is the Bash section of the code.

    3.   

    4.  /usr/local/bin/php -q << EOF

    5.  <?php

    6.      print("This is the PHP section of the code\n");

    7.  ?>

    8.  EOF

    非常简单吧?当你添加一个变量的时候就要小心了,看下面这个代码片断:

    1.  #!/bin/bash

    2.  echo This is the Bash section of the code.

    3.   

    4.  /usr/local/bin/php -q << EOF

    5.  <?php

    6.      $myVar = "PHP";

    7.      print("This is the $myVar section of the code.\n");

    8.  ?>

    9.  EOF

    你将会得到一个错误:

    <b>Parse error</b>: parse error in <b>-</b> on line <b>2</b><br>

    要修正这个错误,你需要转义代码中所有的 '$' 字符:

    1.  #!/bin/bash

    2.  echo This is the Bash section of the code.

    3.   

    4.  /usr/local/bin/php -q << EOF

    5.  <?php

    6.          \$myVar = "PHP";

    7.          print("This is the \$myVar section of the code.\n");

    8.  ?>

    9.  EOF

    现在你可以用 PHP 开始创建自己的 Shell 脚本了。

    # cat zzz
    #!/bin/bash
    a=`echo "$1"|sed 's/.[a-z].//'`
    b=`echo "$2"|sed 's/.[a-z].//'`
    c=`echo "$3"|sed 's/.[a-z].//'`
    echo $a $b $c

    # ./zzz -a=zzz -b=bbb -c=ccc
    zzz bbb ccc

    aliyun活动 https://www.aliyun.com/acts/limit-buy?userCode=re2o7acl
  • 相关阅读:
    校内模拟赛吧 ———— 2019.10.30
    牛客CSP-S提高组赛前集训营1———2019.10.29 18:30 至 22:00
    关于gcd
    洛谷 P1156 垃圾陷阱 题解
    选球游戏 题解———2019.10.19
    小梵同学前进!
    小梵同学 GO!
    先天八卦向后天八卦演进逻辑猜想
    [delphi]在DLL中多线程同步Synchronize卡死问题
    GDI与GDI+性能比较
  • 原文地址:https://www.cnblogs.com/wangbin/p/1538424.html
Copyright © 2020-2023  润新知