将脚本从csh转换为sh?

时间:2018-06-05 13:18:27

标签: bash csh

我正在尝试将*.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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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