2014-01-16 2 views
0

Я пытаюсь адаптировать код цикла от Баша до CSH:Адаптировать петлю Баша будет использование в 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 и в то время как петли без успеха, любая помощь очень ценит это!

+4

Почему вы это делаете? bash, как правило, считается гораздо более понятным языком сценариев. (Я не уверен, насколько хорошо цикл while while read может быть эмулирован в csh.) См. Например, http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot. –

+1

Этот вопрос не соответствует теме, потому что он слишком широк. Вопрос должен быть отредактирован для того, чтобы задать конкретные вопросы о конкретных деталях, с которыми у вас возникли проблемы с переводом, а не просто рассказать о большом блоке кода. –

+0

@ keith-thompson Причина, по которой мне нужно использовать csh, заключается в том, что это единственная среда на сервере, и они отказали мне в использовании bash. – sayayinx

ответ

1

Вы почти наверняка не надо необходимо перевести скрипт из bash в csh.

/bin/sh это оболочка Бурна, или что-то, что очень похоже на это. Это должно иметь место даже в системах, где csh по умолчанию интерактивная оболочкой по и bash недоступен. (В некоторых системах /bin/sh это может быть символической ссылкой на ksh, например.)

bash происходит от Bourne оболочки, и добавляет некоторые особенности, связанные с bash.

Вы можете подтвердить, что /bin/sh является 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. Оболочка Bourne - это * старше *, чем csh. Я обновил свой ответ, чтобы показать, как подтвердить или опровергнуть это, начиная с 4-го абзаца , Если '/ bin/sh' действительно не является оболочкой, похожей на Bourne, какая ОС работает? –

+0

'$ (...)' поддерживается '/ bin/sh', backquotes не требуется. 'FOUND_COUNTER = $ (($ FOUND_COUNTER + 1))' также поддерживается '/ bin/sh'. – chepner

Смежные вопросы