调整bash循环以在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"

输入信息来自变量$input,并包含一个列表,这是列表中的一个示例记录:PL000000002002638908

到目前为止,我已经尝试过使用foreach,虽然循环没有成功,但任何帮助都非常感谢!

您几乎可以肯定不需要将脚本从bash转换为csh。

/bin/sh是Bourne shell,或者类似的东西。即使在csh是默认交互式shell而bash不可用的系统上,情况也应该如此。(例如,在一些系统上,/bin/sh可能是到ksh的符号链接。)

bash源自Bourne shell,并添加了一些特定于bash的特性。

您可以通过在任何shell提示符下键入以下命令来确认/bin/sh是一个类似Bourne的shell:

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

在不太可能的情况下,/bin/sh实际上是csh,上面的内容将给您带来语法错误。

修改脚本以避免bash特定的特性比将其转换为csh更容易。阅读bash手册,查找bash特定的功能,并修改脚本以避免它们。(如果有必要的话,可能/bin/sh至少支持其中一些。)

将脚本的第一行更改为

#!/bin/sh

并查看您收到的错误消息。

您可能需要更换

$(command)

旧的语法

`command`

这个:

(( FOUND_COUNTER++ ))

使用expr的东西,也许:

FOUND_COUNTER=`expr $FOUND_COUNTER + 1`

while read file ...循环应按原样工作。

相关内容

  • 没有找到相关文章

最新更新