我正在尝试将循环代码从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 ...
循环应按原样工作。