Revista Do Linux
 
  
  
 

  Capa
  Evento
  Serviço Público
  Tutorial Programação Shell
  Tutorial PHP
  Software
  Entrevista
  Filosofia
assinantes
 

Shell scripts em PHP

Devido à sua flexibilidade, robustez e, principalmente, facilidade de uso, a linguagem PHP certamente é hoje uma das mais populares para o desenvolvimento de sistemas para a Internet. Dados da Netcraft (www.netcraft.com) comprovam o constante crescimento do PHP, apontando a sua utilização em mais de 1.220.000 servidores web e mais de 10.500.000 domínios diferentes. Apesar dessa espantosa utilização ao redor do mundo, uma das mais poderosas facetas do PHP ainda é pouco explorada e até desconhecida, mesmo por programadores experientes na linguagem. Estamos nos referindo à capacidade de executar scripts PHP através da linha de comando, como um shell script comum, de forma totalmente independente de um servidor web. Para os que estão ouvindo o termo "shell script" pela primeira vez, explicamos que se trata de um arquivo texto com diversos comandos de execução seqüencial. No Linux, os shell scripts são comumente desenvolvidos usando o interpretador Bash, porém podemos desenvolver shell scripts em diversas outras linguagens. As edições de número 17 e 18 da Revista do Linux trazem artigos de autoria de Julio Neves que pode ser muito útil aos que querem dar os primeiros passos no desenvolvimento de shell scripts usando o Bash.

Para aqueles que apenas desenvolvem sistemas para a Internet, a utilização do PHP na criação de shell scripts talvez tenha pouca utilidade, mas os administradores de sistemas rapidamente verão que essa capacidade do PHP de execução através de linha de comando pode abrir um enorme leque de novas possibilidades para a automatização de diversas tarefas de administração rotineiras, com possibilidades até então inexistentes ou de difícil implementação em shell scripts "convencionais". Que tal, por exemplo, criar shell scripts que possam acessar os principais bancos de dados do mercado, livres e comerciais? Ou ainda, que tal criar shell scripts que tenham recursos avançados de rede, como SNMP e sockets? Pois essas são apenas algumas das facilidades que o PHP coloca à nossa disposição.

É verdade que algumas das funcionalidades oferecidas pelo PHP também podem ser conseguidas utilizando-se o próprio Bash e utilitários de linha de comando adicionais. Também é verdade que existem outras alternativas, como a linguagem Perl, por exemplo. Porém, dificilmente essas soluções serão tão simples e de tão fácil implementação quanto os scripts desenvolvidos usando PHP. Além disso, os milhões de usuários do PHP não terão que aprender nenhuma outra linguagem para criar os seus próprios shell scripts.

O básico

Vejamos agora alguns exemplos práticos. Estamos assumindo que o PHP já está instalado e que o leitor tem conhecimentos básicos de PHP e shell scripts. Apesar de os recursos aqui apresentados também estarem disponíveis em outros sistemas operacionais suportados pelo PHP, inclusive no Windows, o nosso foco será a sua utilização no Linux. Para não fugir à regra, iniciaremos com o clássico "Hello, World!". Crie um arquivo texto com o seu editor predileto e inclua as seguintes linhas:

#!/usr/bin/php -q
<?

echo &quot;Alô, mundo!&quot;; ?>

Salve o arquivo, dando-lhe o nome teste1.php. A extensão dada ao nome do arquivo é irrelevante. Porém, para uma melhor identificação do seu conteúdo, é interessante que se use a convenção da extensão .php. Após salvar o arquivo, altere as suas permissões, usando o comando chmod +x teste1.php. Agora só nos resta executar o script e verificar se ele se comporta da maneira esperada.

./teste1.php

O resultado será:

Alô, mundo!

Para quem já programa em PHP, talvez a única novidade do script acima seja a primeira linha (#!/usr/bin/php -q). Repare que ela deve ser sempre a primeira linha do script e deve estar fora dos delimitadores do PHP ( <? ?>). A função dessa linha é dizer qual será o programa usado para interpretar o script (no nosso exemplo, o programa /usr/bin/php). O argumento -q é usado para que o script seja executado em modo silencioso (quiet mode), suprimindo a exibição de cabeçalhos HTTP, que são inúteis para os tipos de scripts nos quais estamos interessados. Parafraseando Larry Wall (o pai do Perl): "há mais de uma maneira de fazer isso". Porém, a forma mostrada é a mais simples e direta. Caso o leitor tenha interesse nas outras maneiras de execução de shell scripts PHP, sugerimos a leitura das referências listadas no quadro Para saber mais.

Interagindo com o usuário

Criemos agora um script mais interativo, chamado teste2.php, onde será solicitada ao usuário uma palavra de até 100 caracteres, e, em seguida, essa palavra será exibida na tela, juntamente com a sua quantidade de caracteres. #!/usr/bin/php -q
<?

echo &quot;Informe uma palavra de até 100 caracteres: &quot;; $var_stdin = fopen('php://stdin', 'r'); $var_palavra = fgets($var_stdin, 100); echo &quot;A palavra digitada foi $var_palavra e possui &quot; . strlen($var_palavra) . ~S caracteres\n~S; ?>

Salve, altere as permissões de execução, e execute o script. Supondo que a palavra informada foi "Linux" o resultado será o seguinte:

./teste2.php
Informe uma palavra de até 100 caracteres: Linux
A palavra digitada foi Linux e possui 6 caracteres

Se você for uma pessoa atenta já deve ter percebido que há alguma coisa errada com o resultado apresentado pelo script, pois a palavra "Linux" possui apenas cinco caracteres e não seis. Além disso, foi incluída uma quebra de linha logo após a exibição da palavra ~SLinux~S. O que ocorreu na verdade é que a instrução $var_palavra = fgets($var_stdin,100); também armazenou na variável $var_palavra o ~SEnter~S que foi teclado logo após termos digitado a palavra Linux. Para resolver essa situação, basta substituir todas as quebras de linha (\n) da variável $var_palavra por um caractere nulo (~S~S). Desta forma, o trecho de código corrigido ficaria da seguinte forma:

$var_palavra = str_replace(&quot;\n&quot;, ~S~S, fgets($var_stdin,100));

Ainda relacionado ao script teste2.php, temos alguns comentários importantes a fazer. Para que pudéssemos ler a entrada de dados a partir do teclado, tivemos que fazer uso da constante pré-definida php://stdin, que representa uma stream de entrada. Temos à nossa disposição no PHP três constantes pré-definidas relacionadas a streams: php://stdin (stream de entrada), php://stdout (stream de saída) e php://stderr (stream de erro). Conhecendo essas três constantes, podemos manipular da forma como bem entendermos as entradas e saídas do nosso programa, utilizando as mesmas funções usadas na manipulação de arquivos (fgets, fwrite, fopen, etc).

Argumentos

Quando estamos trabalhando com o PHP no desenvolvimento de sistemas para a Internet, freqüentemente temos a necessidade de passar valores aos nossos scripts, que geralmente é feito através dos métodos POST e GET. Quando usamos o PHP no desenvolvimento de scripts de linha de comando podemos usar algo semelhante: os argumentos de linha de comando. Para podermos usar argumentos em nossos scripts de linha de comando, o PHP disponibiliza duas variáveis globais: $argc e $argv. A variável $argc armazena o número de argumentos passados ao script. Já a variável $argv é uma matriz que armazena em cada um de seus elementos os argumentos passados ao script. É importante observar que o próprio nome do script é considerado um argumento, recebendo o índice zero da matriz $argv. Vejamos um exemplo, onde passaremos ao script dois argumentos: um nome e uma idade: #!/usr/bin/php -q
<?

echo &quot;Nome : $argv[1]\n&quot;; echo &quot;Idade: $argv[2]\n&quot;; ?>

Vamos executar o script:

./teste3.php klayson bonatto 27

O resultado será:

Nome : klayson
Idade: bonatto

Obviamente não era esse o resultado que esperávamos. Como os argumentos são delimitados por espaços em branco, o PHP interpretou a string "bonatto" como sendo o argumento de índice dois. Se realmente quiséssemos passar o nome completo para o primeiro argumento do script, teríamos que colocá-lo entre aspas duplas. Dessa forma, o script teria que ser executado da seguinte maneira:

./teste3.php "klayson bonatto" 27

E o resultado seria:

Nome : klayson bonatto
Idade: 27

O melhor de dois mundos Administradores de sistemas que já possuem vários shell scripts "convencionais" não precisam reescrever todos os seus programas em PHP só para poder usar recursos específicos da linguagem, como, por exemplo, acesso a bancos de dados. Como veremos abaixo, podemos embutir código PHP dentro de shell scripts comuns.

#!/bin/bash echo -n &quot;Informe o nome do usuário: &quot; read USUARIO HOME='grep ^$USUARIO /etc/passwd | cut -f 6 -d:' TAMANHO_HOME='du $HOME -s -k | cut -f1' /usr/bin/php -q << FIM &lt;? \$DATA=&quot;'date +%d/%m/%Y'&quot;; echo &quot;O diretório home do usuário $USUARIO em \$DATA ocupa $TAMANHO_HOME KB.\n&quot;; ?&gt; FIM

Este script demonstra vários detalhes interessantes. O primeiro a ser observado é que este é um shell script comum, executado pelo Bash (#!/bin/bash), e dentro dele foi incluído um trecho de código em PHP. O truque é a utilização de um here document (no nosso caso, a string "FIM"). Quem já tem alguma experiência na programação de shell scripts, certamente conhece a utilidade deste recurso. Ele transfere, a partir de um determinado ponto do programa, a execução do código para um outro interpretador, até que o here document seja encontrado. Vemos também nesse script como podemos fazer o uso de variáveis dentro do código PHP embutido. Foram usadas variáveis definidas fora e dentro do trecho PHP do script. O uso de variáveis externas ao código PHP é direto, bastando para isso que usemos o nome da variável. Já o uso de variáveis internas requer que o caractere cifrão ($) da variável seja ~Sescapado~S com o uso de uma barra invertida (\) para que possa ser interpretado corretamente. Por fim, repare que o conteúdo da variável \$DATA é o resultado de um comando do sistema operacional, no nosso caso, o comando date. Uma das formas de se executar comandos do sistema operacional dentro do código PHP é incluir o comando entre sinais de aspas simples.

Demonstramos neste artigo como a linguagem PHP pode ser utilizada para o desenvolvimento de shell scripts. Obviamente não temos a pretensão de esgotar o assunto nessas poucas páginas, mas as informações aqui apresentadas são suficientes para que qualquer pessoa com conhecimentos básicos em PHP possa desenvolver scripts de linha de comando extremamente úteis e poderosos. As versões mais recentes do PHP têm trazido algumas novidades no que diz respeito à utilização da linguagem através da linha de comando. A versão 4.2 trouxe experimentalmente uma nova SAPI (Server Application Programming Interface) chamada CLI (Command Line Interface), que, a partir da versão 4.3, passou a ser considerada estável. Novas funcionalidades foram introduzidas e tudo indica que os desenvolvedores do PHP continuarão a dar atenção à CLI, tornando cada vez mais fácil a criação de scripts de linha de comando.

saiba mais:
www.php.net
www.phpbuilder.com
www.tldp.org/LDP/abs/html/index.html
man bash


Klayson Sesana Bonatto klayson.bonatto@es.previdenciasocial.gov.br
É analista de TI do escritório da Dataprev do ES.

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade
Anuncie na Revista do Linux