PHP & Others

PHP를 쉘 스크립트로 사용하기

컨텐츠 정보

본문

오늘날 동적 웹 페이지를 개발하는 최고의 언어가 PHP라는 것은 누구나 다 아는 사실입니다. 하지만 PHP가 쉘 스크립트 언어로도 사용할 수 있다는 것은 모르는 사람이 많은 것 같습니다. 쉘 스크립트 언어로써의 PHP는 Bash나 Perl만큼 튼튼하지는 않지만 많은 이접이 있습니다.
PHP를 쉘 언어로 사용하기 위해 요구되는 것은 PHP를 아파치 모듈 대신 CGI 바이너리로 설치해야 합니다. 보안 문제가 걸려 있기 때문에 PHP메뉴얼의 참고하기 바랍니다.
일반적인 PHP 웹 페이지와 PHP 쉘 스크립트 사이의 단 한가지 차이점은 PHP스크립트의 제일 첫 번째 줄에 다음과 같이 쉘 호출을 해주어야 하는 점입니다.

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

-q 옵션은 HTTP헤더를 사용하지 않겠다는 뜻입니다. 또한 PHP태그를 사용해서 스크립트의 시작과 끝을 지정해 주어야 합니다.

<?php ?>

이제 모든이가 알고 사랑하는 표준 예를 들어봅시다.

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

print("Hello, world!n");

?>

이 코드는 예상하다 시피 화면에 "Hello, world!"를 출력하게 됩니다.

-쉘 스크립트에 매개변수 전달하기(Passing arguments to the shell script)

일반적으로 쉘 스크립트에는 매개변수를 전달 할 수 있어야합니다. 매개변수를 전달하는 것은 다음과 $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");

?>

즉 이 예제에서는 스크립트로 전달된 두 매개변수를 출력합니다. 이 스크립트는 다음과 같이 사용될 수 있고

[dbrogdon@artemis dbrogdon]$ scriptname.ph Darrell Brogdon

다음과 같을 출력을 내게 될 것입니다.

Hello, Darrell Brogdon! How are you today?
[dbrogdon@artemis dbrogdon]$

쉘 스크립트와 웹 페이지에서 $argv 배열의 차이점은 쉘 스크립트의 $argv[0]은 실행된 스크립트 명이 들어 간다는 점입니다. 웹 페이지에서는 첫 번째 값($argv[0])은 query 문자열입니다.

-스크립트를 인터액티브하게 만들기(Making a script more interactive)

그러데 어떻게 해야 사용자의 입력을 받아들일 수 있을까요? 어떻게 인터액티브한 스크립트를 생성할 수 있을까요? PHP는 웹상에서 명령을 읽어오는 함수는 기본적으로 지원하지 않습니다. 하지만 다음과 같은 PHP 함수를 사용해서 에뮬레이트할 수 있습니다.

주 : 이 함수는 Unix상에서만 동작합니다.

<?php

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

return $input;
}

?>

이 함수는 표준 입력(Linux에서 /dev/stdin)을 의미하는 파일 포인터를 오픈하고 n이나 EOF를 만나거나 255문자까지 읽어 옵니다. 주로 n가지 일어오게 될 것입니다. 그런 다음 파일 포인터를 닫고 데이터를 리턴합니다.

이제 앞서든 예제 스크립트를 수정해서 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()함수가 n문자까지 취했기 때문입니다. 이는 read()함수가 데이터를 리턴할 때 n을 제거해서 데이터를 리턴하게 하면 해결됩니다.

<?php

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

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

?>

- PHP 쉘 스크립트를 일반 쉘 스크립트에 포함시키기

때때로 PHP쉘 스크립트를 Bash나 다른 쉘 스크립트에 삽입하는 것이 편할 때도 있습니다. 이는 간단한 트릭으로 가능합니다.
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 coden");
?>
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>

이를 해결하기 위해서 PHP코드의 $앞에 를 붙여 줍니다.

#!/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를 사용해서 자신의 쉘 스크립트를 만들어 보세요~

--Darrell
--번역 : 허련호



kjh90@orgio.net
1]
# php -q your_script.php
이런 식으로 사용하는 대신
# ./your_script.php
라고 실행하려면
스크립트 맨 첫줄에는
#!/usr/local/bin/php -q
라고 쓰고, 그 아래에 <? 로 시작해서 ?>로 끝나는 PHP 구문을 씁니다.

[2]
콘솔 상에서 입력을 받는 경우에는
fopen("php://stdin", "r");
을 사용합니다.

예제:
#!/usr/local/bin/php -q
<?php
function getInput($length = 255) {
$fr = fopen("php://stdin", "r");
$input = fgets($fr, $length);
$input = rtrim($input);
fclose($fr);
return $input;
}
echo '글자를 입력하세요 (10자 이내): ';
$text = getInput(10);
echo '입력하신 내용은 '.$text."입니다.\\n";
?>

[3]
물론 PHP 스크립트에는 실행권한이 주어져야겠죠.

관련자료

댓글 0
등록된 댓글이 없습니다.
Today's proverb
“무릇 물이란 지세를 따라 흐르되 작은 틈도 놓치지 않고 적시니 지혜를 갖춘 자와 같고, 움직이면서 아래로 흘러가니 예를 갖춘 자와 같으며, 어떤 깊은 곳도 머뭇거리지 않고 들어가니 용기를 가진 자와 같고 장애물이 막혀서 갇히면 고요히 맑아지니 천명을 아는 자와 같으며, 험한 곳을 거쳐 멀리 흐르지만 끝내 남을 허물어뜨리는 법이 없으니 덕을 가진 자와 같다. 천지는 이것으로 이루어지고, 만물은 이것으로 살아가며, 나라는 이것으로 안녕을 얻고, 만사는 이것으로 평안해지며, 만물은 이것으로 바르게 되는 것이다. 이것이 지혜로운 자가 물을 좋아하는 이유이다.” (한영, <<한시외전>>)