2013-11-29 5 views
0

이것은 쉘 스크립트의 일부입니다. 디스크 사용량을 확인합니다. 이것이 펄 스크립트로 어떻게 변환 될 수 있는지 알고 싶습니까? 도와주세요.쉘을 perl로 변환하는 방법

DFCMD="df -P" 

for fs in `eval $DFCMD`; do 

FS=`echo $fs | awk ' { print $1 } '` 

done 

감사

+0

그것을 할 것 스택 오버플로에서 무료 솔루션을 기대하는 것은 잘못입니다. Perl을 모르는 경우 학습을 시작하는 데 잘못된 장소입니다. 펄을 이해하고 자신이 그것을 어떻게 사용할 수 있는지 확신 할 때까지 몇 주간 책을 읽고 운동을 시도해야합니다. 그 후에도 자신 만의 솔루션을 작성했지만 여전히 문제가 발생하면 여기로 와서 프로그램을 보여주고 문제를 설명해야합니다. 그러면 우리가 너를 도울거야. – Borodin

+3

셸 변수를 설정하는 것이 목적이므로이 셸 스크립트를 perl로 변환 할 수 없습니다. perl은 환경 변수를 설정하고 새 쉘을 생성 할 수 있지만 쉘을 호출 한 변수를 설정할 수는 없습니다. (이 문제를 해결할 수있는 방법은 있지만 뭔가 다른 일을 한 펄 프로그램이 될 것입니다.) – ysth

답변

0

아니라, 펄, 종종 쉘 명령을 실행하기 위해 시스템() 함수를 사용하고 있지만, 시스템() 함수를 사용할 수 command.You의 결과를 반환 할 수있다 backticks (``)를 사용하여 출력을 얻습니다. 아웃 넣어 사용하면 스크립트를 펄 쉘 스크립트를 변환 할 수 있습니다

1 #!/usr/bin/perl 
    2 use strict; 
    3 use warnings; 
    4 
    5 my @output = split('\r\n', `df -P | awk '{print \$1}'`); 
    6 print @output; 
+0

고마워요. 나는 당신의 제안을 모두 시험했는데, 예상했던대로 여전히 효과가 없습니다. 내가이 질문을 한 이유는 각 변수를 일부 조작에 사용하기 위해서입니다. 각 마운트 포인트에 대해 FS 변수를 얻으면 마운트 된 디렉토리가 90 %보다 큰지 확인할 수 있습니다. 그래서 perl 스크립트를 사용하여 각 줄을 읽어야합니다. 예, 저는 Perl의 전문가가 아니므로 미안합니다. lol –

1

이 그것을 할 수있는 1liner 아마,하지만 난이 (테스트되지 않은)

my @command = qw/df -P/; 
open(my $in, "-|", @command) or die "Can't run `@command`: $!"; 
while(<$in>) { 
    my ($first_col) = split; 
    print "$first_col\n"; 
} 
+1

(1) 스칼라 문맥에서,'split'은리스트 컨텍스트의 필드 카운트를 반환합니다. 우리는'@ array' ('my @cols = split; print "$ cols [0] \ n"')에 할당 할 수 있습니다. 또는 편집에 따라 목록에서 첫 번째 요소의 압축을 풀 수 있습니다. (2)'split/\ s + \, $ _'은 효과가 없을 것입니다. 기본 변수 인'$ _'는 지정 될 필요가 없습니다. 정규 표현식'/ \ s + /'는 기본 동작과 유사하므로이를 사용합니다. (3)'open'은 어휘 파일 핸들을 생성해야합니다. 인수 목록을 전달하면 쉘을 우회하므로 더 안전합니다. 또한 오류 처리가 좋습니다. – amon

1
perl -le 'print /(\S+)/ for `df -P`' 
+0

'df -P | perl -anE'say $ F [0] '더 짧게';-) – amon

+1

@amon 예,하지만 좀 더 쉘 솔루션이고 OP는 더 많은 perl을 원했습니다 :) btw, chomping이없고'say'이 하나 이상의 개행을 생성합니다. –

관련 문제