2010-08-26 41 views
3

我一直被委託在bash中重寫它。但是,雖然大多數PowerShell容易閱讀,我只是沒有得到這個塊實際上做了什麼!!?有任何想法嗎?如何重新編寫bash中的powershell代碼

它需要一個文件,首先按鍵排序,也許這是相關的!

感謝您的任何見解!

foreach ($line in $sfile) 
{ 
    $row = $line.split('|'); 

    if (-not $ops[$row[1]]) { 
    $ops[$row[1]] = 0; 
    } 

    if ($row[4] -eq '0') { 
    $ops[$row[1]]++; 
    } 

    if ($row[4] -eq '1') { 
    $ops[$row[1]]--; 
    } 

    #write-host $line $ops[$row[1]]; 

    $prevrow = $row; 
} 
+0

沒有真正知道片斷* *是相當模糊的腳本的域和一般的意圖,實際上。變量名稱而不是索引可以在這裏很好地工作(例如'$ name,$ description,$ date,$ somethingelse = $ line -split'|'')。 – Joey 2012-07-12 11:37:36

回答

0

您正在分割'|'字符串到數組行。它看起來像使用$ row數組作爲$ ops var的某種類型的鍵。第一個if如果測試看到對象是否存在,如果它不存在,則它在$ ops中創建它,第二個和第三個ifs測試以查看$ row中的第五個元素是否爲零,並且是否爲1並且增加或減少首先如果。

3

也許有點重構將幫助:

foreach ($line in $sfile) 
{ 
    # $row is an array of fields on this line that were separated by '|' 
    $row = $line.split('|'); 
    $key = $row[1] 
    $interestingCol = $row[4] 

    # Initialize $ops entry for key if it doesn't 
    # exist (or if key does exist and the value is 0, $null or $false) 
    if (-not $ops[$key]) { 
    $ops[$key] = 0; 
    } 

    if ($interestingCol -eq '0') { 
    $ops[$key]++; 
    } 
    elseif ($interestingCol -eq '1') { 
    $ops[$key]--; 
    } 

    #write-host $line $ops[$key]; 

    # This appears to be dead code - unless it is used later 
    $prevrow = $row; 
} 
0

約:

#!/bin/bash 
saveIFS=$IFS 
while read -r line 
do 
    IFS='|' 
    row=($line) 

    # I don't know whether this is intended to test for existence or a boolean value 
    if [[ ! ${ops[${row[1]}] ]] 
    then 
     ops[${row[1]}]=0 
    fi 

    if ((${row[4]} == 0)) 
    then 
     ((ops[${row[1]}]++)) 
    fi 


    if ((${row[4]} == 1)) 
    then 
     ((ops[${row[1]}]--)) 
    fi 

    # commented out 
    # echo "$line ${ops[${row[1]}]} 

    prevrow=$row 
done < "$sfile"