Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 批处理文件以读取文件内容并进行迭代_Linux_Bash_Shell_Flyway - Fatal编程技术网

Linux 批处理文件以读取文件内容并进行迭代

Linux 批处理文件以读取文件内容并进行迭代,linux,bash,shell,flyway,Linux,Bash,Shell,Flyway,我正在尝试编写一个批处理文件/shell脚本,该脚本读取文件的内容,将这些内容与目录结构匹配,并调用一个可执行文件 假设/system/目录中有一个sequence.txt文件。序列文件用于表示或强制执行顺序。这很重要 sequence.txt文件包含以下条目: 1;schema1;procedures 1;schema1;functions 2;schema2;procedures 2;schema2;functions ........ 然后有一个目录,该目录有以下子目录 /scripts

我正在尝试编写一个批处理文件/shell脚本,该脚本读取文件的内容,将这些内容与目录结构匹配,并调用一个可执行文件

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

sequence.txt文件包含以下条目:

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(一种数据库迁移软件):

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
#/bin/bash
当我读书时;
做回显“$i”;
完成<./system/sequence.txt
我如何进一步进行?我知道这种脚本涉及变量,然后循环,但我找不到一种方法将其转换为技术级别


干杯并提前感谢!:-)

我不确定值和最终命令路径之间的确切关系,但awk是构造调用的工具。使用类似于:

c = `echo $i | awk -F ";" '{print "flyway" $1 "_" $2}' 
其中$x是值的位置,您可以构造一个字符串

之后,您可以使用

`echo $c`
这应该行得通

更新:

如果我正确理解您的需要,您必须设置两个while,一个在另一个内。大概是这样的:

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

我不确定值和最终命令路径之间的确切关系,但awk是构造调用的工具。使用类似于:

c = `echo $i | awk -F ";" '{print "flyway" $1 "_" $2}' 
其中$x是值的位置,您可以构造一个字符串

之后,您可以使用

`echo $c`
这应该行得通

更新:

如果我正确理解您的需要,您必须设置两个while,一个在另一个内。大概是这样的:

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

虽然不完全清楚您想要什么,但以下是一些启示:

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

虽然不完全清楚您想要什么,但以下是一些启示:

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

谢谢你的回复。我想我不是很精确。我的问题是如何将半公共分隔文件中的值与目录结构相匹配。然后创建URL,然后按照文件中的顺序进行创建,并将其提供给程序。谢谢您的回复。我想我不是很精确。我的问题是如何将半公共分隔文件中的值与目录结构相匹配。然后创建URL,然后按照文件中的顺序进行创建,并将其提供给程序。谢谢,这正是我需要的:-)谢谢,这正是我需要的:-)