2014-01-16 28 views
0

我想要的循環代碼適應從慶典到CSH:適應bash的循環是在csh使用

while read file; do 

    if ! UPLOAD_FILE=$(ls "$UPLOAD_ARCHIVE_DIR"/*$file* 2>/dev/null); then 
    echo "could not find $file" 
    ((MISSING_COUNTER++)) 
    continue 
    fi 

    ls -l "$UPLOAD_FILE" | sed 's/^[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]* *//' 
    cp "$UPLOAD_FILE" "$PROCESS_FILES_DIR" 
    DOS_FILE=$(basename "$UPLOAD_FILE") 
    SOR_FILE=$(echo $DOS_FILE | sed 's/.dat/.sor/') 
    unix2dos "$PROCESS_FILES_DIR"/"$DOS_FILE" 1>/dev/null 2>&1 
    mv "$PROCESS_FILES_DIR"/"$DOS_FILE" "$UPLOAD_PROCESS_DIR" 

    ((FOUND_COUNTER++)) 
done < "$1" 

輸入信息來自變量$輸入,幷包含一個列表,這裏是一個樣本記錄清單:PL000000002002638908

到目前爲止,我試圖用foreach和while循環沒有成功,任何幫助都非常感謝它!

+4

你爲什麼這樣做? bash通常被認爲是一種更好的腳本語言。 (我不確定在csh中模擬'while read ...'循環的效果。)例如,請參閱http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot。 –

+1

這個問題似乎是無關緊要的,因爲它太寬泛。應該編輯這個問題,詢問您翻譯時遇到的特定問題的具體問題,而不是廣泛詢問大量代碼。 –

+0

@ keith-thompson我需要使用csh的原因是因爲它是服務器上唯一的環境,他們拒絕使用bash。 – sayayinx

回答

1

您幾乎可以肯定不需要需要將您的腳本從bash轉換爲csh。

/bin/sh是Bourne shell,或者其他非常類似的東西。這應該是即使在系統中的情況,其中csh是默認的交互式殼和bash是不可用的。(在一些系統,/bin/sh它可能是一個符號鏈接到ksh,例如。)

bash從伯恩殼衍生並添加了一些特定於bash的功能。

您可以確認/bin/sh是在任何shell提示下鍵入以下命令類似Bourne外殼:

/bin/sh -c 'if true ; then echo Yes, this is a Bourne-like shell ; fi' 

在萬一/bin/sh真的csh,上述會給你一個語法錯誤。

修改您的腳本以避免bash特有的功能比將其轉換爲csh更容易。閱讀bash manual,查找Bash特有的功能,並修改腳本以避免它們。 (如果這甚至是必要的,它可能是/bin/sh的東西,至少支持其中的一些。)

更改腳本的第一行

#!/bin/sh 

,看看你會得到什麼錯誤消息。

您可能需要通過老

`command` 

更換

$(command) 

語法和這樣的:

((FOUND_COUNTER++)) 

的東西用expr,也許是:

FOUND_COUNTER=`expr $FOUND_COUNTER + 1` 

while read file ...循環應該照原樣工作。

+0

謝謝,不幸的是,這個arcaic系統應該運行csh,其他任何東西都是不允許的。 – sayayinx

+0

* /很可能'/ bin/sh'是一個類似Bourne的shell。Bourne shell是*比* csh更老*我已經更新了我的答案,以顯示如何確認或反駁此問題,從第4段開始。如果'/ bin/sh'確實不是一個類似Bourne的shell,那麼這個系統運行的是什麼操作系統? –

+0

'$(...)'由'/ bin/sh'支持,反引號將不是必需的。 '/ bin/sh'也支持'FOUND_COUNTER = $(($ FOUND_COUNTER + 1))'。 – chepner