2013-11-29 47 views
0

這是Shell腳本的一部分。 這是爲了檢查磁盤的使用情況。 我想知道這可以轉換爲Perl腳本? 請幫我這個。如何將shell轉換爲perl

DFCMD="df -P" 

for fs in `eval $DFCMD`; do 

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

done 

由於

+0

它期待堆棧溢出的免費解決方案是錯誤的。如果你根本不瞭解Perl,那麼這是開始學習的錯誤地方。你應該花幾個星期看書並嘗試練習,直到你確信你理解Perl以及如何使用它。之後,如果您已經編寫了自己的解決方案,但仍然無法正常工作,那麼您應該回到此處並顯示您的程序並描述您擁有的問題。那麼我們會幫助你。 – Borodin

+3

不可能將此shell腳本轉換爲perl,因爲它的目的是設置shell變量; perl可以設置一個環境變量併產生一個新的shell,但不能在調用它的shell中設置一個變量。 (有辦法解決這個問題,但這將是一個perl程序,做了一些不同的事情。) – ysth

回答

0

井,在Perl,它經常使用系統()函數來執行shell命令,但該系統()函數可以不返回command.You的輸出可以使用反引號(``)來獲得輸出。使用了放,我們也可以將shell腳本perl腳本

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]'#even short' ;-) – amon

+1

@amon是的,但它有點更多的shell解決方案和OP想要更多的perl :)順便說一句,沒有chomping和'say'產生一個更多的換行符。 –