我正在尝试将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循环但没有成功,任何帮助都非常感谢!
答案 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 ...
循环应该按原样运行。