【问题标题】:Adapt bash loop to be use in csh [closed]调整 bash 循环以在 csh 中使用 [关闭]
【发布时间】:2014-01-16 18:27:50
【问题描述】:

我正在尝试将循环代码从 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 循环但没有成功,任何帮助都非常感谢!

【问题讨论】:

  • 你为什么要这样做? bash 通常被认为是一种更好的脚本语言。 (我不确定在 csh 中模拟 while read ... 循环的效果如何。)例如,请参阅 perl.com/doc/FMTEYEWTK/versus/csh.whynot
  • 这个问题似乎离题了,因为它太宽泛了。应该编辑问题以针对您在翻译时遇到问题的特定部分提出具体问题,而不是泛泛地询问一大段代码。
  • @keith-thompson 我需要使用 csh 的原因是因为它是服务器上唯一的环境,他们拒绝我使用 bash。
  • @john-kugelman 我已经指定了相关主题。另外,我已经从代码中删除了额外的信息。
  • 你是说机器上的/bin/sh其实是csh?我发现这不太可能,而且将 bash 代码显示为符合 POSIX 标准要比将其转换为 csh 容易得多。

标签: bash unix csh


【解决方案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 至少支持其中的一些。)

将脚本的第一行更改为

#!/bin/sh

看看你得到了什么错误信息。

您可能需要更换

$(command)

旧语法

`command`

还有这个:

(( FOUND_COUNTER++ ))

使用expr,也许:

FOUND_COUNTER=`expr $FOUND_COUNTER + 1`

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

【讨论】:

  • 谢谢,不幸的是这个古老的系统应该运行csh,其他的都是不允许的。
  • /bin/sh 很可能是一个类似 Bourne 的 shell。 Bourne shell 比 csh 。从第 4 段开始,我已经更新了我的答案以显示如何确认或反驳这一点。如果/bin/sh 真的不是类似 Bourne 的 shell,那么这个系统运行的是什么操作系统?
  • $(...)/bin/sh 支持,不需要反引号。 FOUND_COUNTER=$(( $FOUND_COUNTER + 1 )) 也被 /bin/sh 支持。
  • @chepner:这取决于系统。最初的 Bourne shell 不支持这些功能中的任何一个。 OP 说他使用的系统是“过时的”,所以/bin/sh 很可能是一个较旧的 Bourne-like shell。例如,我目前登录到一个 Solaris 9 系统,/bin/sh 报告这两个功能的语法错误。但这当然值得检查(这就是为什么我说 OP 可能 需要替换这些构造);如果/bin/sh 恰好更现代一点,那将节省一些工作。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2013-12-13
  • 1970-01-01
  • 2012-09-07
  • 2017-09-24
相关资源
最近更新 更多