Bash Expect脚本:运行两个名称相似的文件

Bash Expect脚本:运行两个名称相似的文件,bash,file-io,expect,Bash,File Io,Expect,我正在尝试使用脚本自动运行一个程序,但我做错了什么。 我的当前目录中有一堆文件遵循以下命名约定: file_name-hereROI.txt file_name-hereFR.txt file1_name-hereROI.txt file1_name-hereFR.txt file_name1-hereROI.txt file_name1-hereFR.txt file_name-here1ROI.txt file_name-here1FR.txt 我想做的是在每一对上运行一个程序。因此,如果

我正在尝试使用脚本自动运行一个程序,但我做错了什么。 我的当前目录中有一堆文件遵循以下命名约定:

file_name-hereROI.txt
file_name-hereFR.txt
file1_name-hereROI.txt
file1_name-hereFR.txt
file_name1-hereROI.txt
file_name1-hereFR.txt
file_name-here1ROI.txt
file_name-here1FR.txt
我想做的是在每一对上运行一个程序。因此,如果“ROI”或“FR”之前的字符串相同,则应通过水进行比较。 我写过:

  1 #/usr/bin/expect
  2 for f in *ROI.fasta
  3 do
  4   for f2 in *FR.fasta
  5   do
  6     fROI=$(echo $f | cut -d'ROI' -f 1)
  7     f2ROI=$(echo $f2 | cut -d'FR' -f 1)
  8     if [$fROI == $f2ROI]
  9     then
 10       spawn water f f2
 11       expect "Gap opening penalty [10.0]:"
 12       send "\n"
 13       expect "Gap extension penalty [0.5]:"
 14       send "\n"
 15       expect "Output alignment"
 16       send "\n"
 17       close
 18     fi
 19   done < ls
 20 done < ls

我认为您正在混淆bash和Tcl/Expect符号

Expect是Tcl的一个扩展,因此,如果要让Expect解释脚本,则需要使用Tcl的构造

首先,您需要使用Tcl的“For”循环

有关所需的其他条件(if、while等),请参阅Tcl文档的其余部分。

foreach f[glob*ROI.txt]{
设置f2“[string range$f 0[expr{[string length$f]-8}]]FR.txt”
如果{[文件存在$f2]}{
产卵水$f$f2
# ...
}
}
避免硬编码数字“8”


这是一个很好的资源。如果我想把-8改为-10,我该怎么说呢?在bash中,必须使用特殊的括号。
$ expect water.sh 
wrong # args: should be "for start test next command"
    while executing
"for f in *ROI.fasta"
    (file "water.sh" line 2)
set suffix "ROI.txt"
set new_suffix "FR.txt"
foreach f [glob *$suffix] {
    set prefix [regsub "$suffix\$" $f ""]
    # or
    set idx [string last $suffix $f]
    set prefix [string range $f 0 [incr idx -1]]

    set f2 $prefix$new_suffix
    # ...
}