【问题标题】:Convert script from csh to sh?将脚本从 csh 转换为 sh?
【发布时间】:2018-11-15 00:02:05
【问题描述】:

我正在尝试将 *.csh 脚本转换为 *.sh。我在这个块上遇到了麻烦。

foreach f (tmp*)
echo $f
set zid = `grep db $f`
if !(-e "$zid".mol2) then
set filename = "$zid".mol2
else foreach n (`seq -w 1 11247`)
if !(-e "$zid"_"$n".mol2) then
set filename = "$zid"_"$n".mol2     break
endif
end
endif
mv -v $f $filename
end

我试着把它改成这样:

 for f in tmp*
 do
 echo $f
 set zid = `grep db $f`
 if ! [-e "$zid".mol2] ; then
 set filename = "$zid".mol2
 else for n in `seq -w 1 11247`
 if ! [-e "$zid"_"$n".mol2] ; then
 set filename = "$zid"_"$n".mol2
 break
 fi
 done
 fi
 mv -v $f $filename
 done

但我收到此错误:

 ./scripts/ex01.sh: line 31: syntax error near unexpected token `if'
 ./scripts/ex01.sh: line 31: `if ! [-e "$zid"_"$n".mol2] ; then'

这部分我也有问题cat $VSTROOT/db.mol2 | csplit -ftmp -n4 -ks - '%^@.TRIPOS.MOLECULE%' '/^@.TRIPOS.MOLECULE/' '{*}'

我在哪里预设VSTROOT=pwd,但执行时它告诉我cat: pwd/db.mol2: No such file or directory

【问题讨论】:

  • Bash(逻辑否定)[tldp.org/LDP/abs/html/comparison-ops.html] is !=
  • VSTROOT=$(pwd)调用命令,或者使用内置变量VSTROOT=$PWD
  • 另外,您可以将 shell 代码粘贴到 shellcheck.net 以获得语法和最佳实践方面的帮助
  • 您似乎将[ -e 拼错为[-e。在求助于互联网的智慧之前,通过shellcheck(或使用在线服务)运行您的代码。哦,你错过了do,但错误消息已经告诉你了。
  • 我试过VSTROOT=$(pwd) 还是不行。它似乎适用于从 echo 到 ls 的所有东西,但 cd 只是不起作用。无论如何我可以解决这个问题吗?

标签: bash csh


【解决方案1】:

没有真正评论此脚本的适当性,而只是解决句法问题,主要错误是变量分配不正确、缺少“do”、误用/滥用[ 命令以及其他一些细节.试试:

    for f in tmp*
    do
        echo "$f"
        zid=$(grep db "$f")
        if ! [ -e "$zid".mol2 ] ; then
            filename="$zid".mol2
        else 
            for n in $(seq -w 1 11247)
            do
                if ! [ -e "$zid"_"$n".mol2 ] ; then
                    filename="$zid"_"$n".mol2
                    break
                 fi
            done
        fi
        mv -v "$f" "$filename"
    done

【讨论】:

    【解决方案2】:

    Bash 不喜欢空格,它喜欢 vars 周围的括号......无论如何,它看起来像这样(未经测试的代码):

    for f in tmp* ; do
        echo $f
        zid=$(grep db $f)
        if ! [ -e "$zid".mol2 ] ; then
            filename="$zid".mol2
         else
            for ((n=1; n<11248; n++ )) ; do
                if ! [ -e "$zid"_"$n".mol2 ] ; then
                    filename="$zid"_"$n".mol2
                    break
                fi
            done
        fi
        mv -v $f $filename
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 2012-05-22
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多