컴퓨터 PHP를 쉘 스크립트로 쓰기
2004.08.04 10:10
오늘날 동적 웹 페이지를 개발하는 최고의 언어가 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 스크립트에는 실행권한이 주어져야겠죠.
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
| 번호 | 제목 | 글쓴이 | 날짜 | 조회 수 | 추천 수 |
|---|---|---|---|---|---|
| 835 | 예송논쟁 | RanomA | 2003.01.14 | 3938 | 0 |
| 834 | 갑자사화와 연산군식의 개혁 | RanomA | 2003.01.14 | 2297 | 0 |
| 833 | 이인화와 영원한 제국 | RanomA | 2003.01.14 | 1636 | 0 |
| 832 |
이상한 신문...
| RanomA | 2003.01.14 | 1023 | 10 |
| 831 | 필요한 건 상상력과 꼼꼼함... 그리고 긴 호흡... | RanomA | 2003.02.02 | 1249 | 0 |
| 830 | 일단 1권 다 읽었음... | RanomA | 2003.02.03 | 1398 | 0 |
| 829 | 추가로 영화와 책의 차이점. | RanomA | 2003.02.04 | 1327 | 0 |
| 828 | 성종이 어우동에게 느꼈던 분노감 | RanomA | 2003.02.11 | 2450 | 0 |
| 827 | 비둘기 가족을 부른 이석이라는 사람... | RanomA | 2003.02.16 | 1571 | 0 |
| 826 | 대한민국의 맘에 안드는 점 하나... | RanomA | 2003.02.19 | 1284 | 0 |
| 825 | 저는 오늘 꽃을 받았어요. [3] | RanomA | 2003.02.23 | 1516 | 0 |
| 824 | 난방보다 냉방이 어려운 이유... | RanomA | 2003.02.24 | 1911 | 0 |
| 823 | 그들이 하고픈 말은... [1] | RanomA | 2003.03.04 | 1210 | 0 |
| 822 | 제로보드와 내 홈피 게시판의 차이... | RanomA | 2003.03.09 | 2271 | 0 |
| 821 |
자료실의 첨부파일 개수가 무한대로...
| RanomA | 2003.03.26 | 1157 | 0 |
| 820 | MySQL 백업관련 명령어 몇 개 | RanomA | 2003.03.28 | 1123 | 0 |
| 819 |
MySQL 매뉴얼
| RanomA | 2003.03.28 | 936 | 14 |
| 818 |
Informix FAQ for Monitor, Tune, Support
| RanomA | 2003.04.08 | 926 | 11 |
| 817 | '근로자의 날'보다는 '노동절'이라고 칭합시다. | RanomA | 2003.04.29 | 981 | 0 |
| 816 | 나이수~~~ 유시민~~~ [2] | RanomA | 2003.04.29 | 1047 | 0 |






