调整bash循环以在csh中使用

时间:2014-01-16 18:27:50

标签: bash unix 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和while循环但没有成功,任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:1)

您几乎肯定需要将您的脚本从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 manual,查找特定于Bash的功能,并修改脚本以避免它们。 (如果这甚至是必要的;可能/bin/sh至少支持其中一些。{/ p>

将脚本的第一行更改为

#!/bin/sh

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

您可能需要更换

$(command)
旧版

的语法
`command`

和此:

(( FOUND_COUNTER++ ))

使用expr,或许:

FOUND_COUNTER=`expr $FOUND_COUNTER + 1`

while read file ...循环应该按原样运行。