批处理文件读取文件内容和迭代

问题描述:

我想写一个批处理文件/ shell脚本读取文件的内容,将这些内容与目录结构匹配并调用可执行文件。批处理文件读取文件内容和迭代

假设/ system /目录中有一个sequence.txt文件。序列文件是表示或强制执行的顺序。这一点很重要

的sequence.txt文件有以下enteries:

1;schema1;procedures 
1;schema1;functions 
2;schema2;procedures 
2;schema2;functions 
........ 

,然后有一个目录,该目录有以下子目录

/scripts 
| +--/schema1 
| | +--/procedures 
| | | --1.sql 
| | | --2.sql 
| | +--/functions 
| | | --1.sql 
| | | --2.sql 
| | +--/packages 
| | | --1.sql 
| | | --2.sql 
| | +--/logs 
| +--/schema2 
| | +--/procedures 
| | | --1.sql 
| | | --2.sql 
| | +--/functions 
| | | --1.sql 
| | | --2.sql 
| | +--/packages 
| | | --1.sql 
| | | --2.sql 
| | +--/logs 
....... 
........ 

现在我想运行的飞行路线(一个数据库迁移软件)以这种方式循环使用:

Flyway -schema=schema1 -locations=/scripts/schema1/procedures, /scripts/schema1/functions, /scripts/schema1/packages migrate -x | tee /scripts/schema1/log/logfile_ddmmyy.log 

Flyway -schema=schema2 -locations=/scripts/schema2/procedures, /scripts/schema2/functions, /scripts/schema2/packages migrate -x | tee /scripts/schema2/log/logfile_ddmmyy.log 

所以远远是我的进步:

#!/bin/bash 
while read i; 
    do echo "$i"; 
done < ./system/sequence.txt 

我该如何进一步处理?我知道这种脚本涉及变量,然后循环,但我找不到将其转化为技术层面的方法。

欢呼声,并提前致谢! :-)

虽然不是你想要的东西完全清楚,这里是一些启示:

while read line; do 
    OIFS=$IFS 
    IFS=';' 
    a=() 
    for name in ${line}; do 
     a+=(${name}) 
    done 
    IFS=$OIFS 
    number=${a[0]} 
    schema=${a[1]} 
    subdir=${a[2]} 
    echo "Flyway -schema=${schema} -locations=/scripts/${schema}/procedures, /scripts/${schema}/functions, /scripts/${schema}/packages migrate -x | tee /scripts/${schema}/log/logfile_ddmmyy.log" 
done <<EOF 
1;schema1;procedures 
1;schema1;functions 
2;schema2;procedures 
2;schema2;functions 
EOF 

它不exexute Flymake,它只是echo的Flymake命令。

它使用特殊变量$IFS来做魔术。

满足您的需求。

输出

Flyway -schema=schema1 -locations=/scripts/schema1/procedures, /scripts/schema1/functions, /scripts/schema1/packages migrate -x | tee /scripts/schema1/log/logfile_ddmmyy.log 
Flyway -schema=schema1 -locations=/scripts/schema1/procedures, /scripts/schema1/functions, /scripts/schema1/packages migrate -x | tee /scripts/schema1/log/logfile_ddmmyy.log 
Flyway -schema=schema2 -locations=/scripts/schema2/procedures, /scripts/schema2/functions, /scripts/schema2/packages migrate -x | tee /scripts/schema2/log/logfile_ddmmyy.log 
Flyway -schema=schema2 -locations=/scripts/schema2/procedures, /scripts/schema2/functions, /scripts/schema2/packages migrate -x | tee /scripts/schema2/log/logfile_ddmmyy.log 
+0

谢谢,这正是我所需要的:-) – Jaanna

我不确定值和最终命令路径之间的确切关系,但awk是构建调用的工具。使用这样的事:

c = `echo $i | awk -F ";" '{print "flyway" $1 "_" $2}' 

其中$ x是值的位置,你可以构造一个字符串。

,您可以用

`echo $c` 

这应该工作运行c VAR

后。

更新:

如果我理解正确的话,你需要什么,你必须设置两个田地,一个在另一个内。事情是这样的:

cat tt.txt | awk -F";" '{print $1}'| sort -u | while read i 
do 
sc = `grep $i tt.txt | head -n 1 | awk -F";" '{print $2}'` 
pt1 = "Flyway -schema=" $sc " -locations=" 
pt3 = " -x | tee /scripts/" $sc "/log/logfile_ddmmyy.log" 
grep $i tt.txt | while read j 
do 
    c=`echo $j | awk -F";" '{print $2}'| sort -u` 
    pt2 = $pt2 "/scripts/" $sc "/" $c "" 
done 
echo $pt1 $pt2 $pt3 
done 
+0

感谢您的答复。我想我不是很精确。 我的问题是关于匹配semicomma分隔文件中的值与目录结构。然后创建URL,创建将按照文件中的顺序完成,并将其提供给程序。 – Jaanna