0

这是对此处发布的问题的跟进Shell script to execute nohup against an input filename

我只是想设法修改下面的 no_hup 脚本以针对整个 SQL 脚本目录执行,而不仅仅是单个文件。因此,我试图找到一种修改以下脚本以针对整个文件目录执行的好方法:

如何编写一个 shell 脚本,以便可以针对包含文件 foo1.sql、foo2.sql、foo3.sql 的名为 test 的目录运行

./nohup_sh 测试

这将产生输出

nohup psql -d db -f test/foo1.sql >& test/foo1.out &

nohup psql -d db -f test/foo2.sql >& test/foo2.out &

nohup psql -d db -f test/foo3.sql >& test/foo3.out &

这是我在上一个名为 nohup_sh 的答案中使用的代码

#!/bin/bash

outputFile="$(echo $1 | cut -d\. -f 1).out"

nohup psql -d db -f "$1" >& "$outputFile" &
4

2 回答 2

5
#!/bin/bash

for file; do
    nohup psql -d db -f "$file" >& "${file%.*}.out" &
done

${file%.*}bash 参数扩展以执行与您的cut 命令相同但使用bash builtin

for file是的简写for file in "$@"

用法 :

./script.bash sql_dir/*.sql

或者

./script.bash *.sql
于 2013-02-21T21:26:23.787 回答
1

以下脚本搜索*.sql作为参数传递的目录中的任何文件并执行所需的 nohup 命令。找到的文件名由空字节分隔以避免文件名中的空格或通配符问题。

#!/bin/bash
if [[ -d "$1" ]]; then
    find "$1/" -type f -name "*.sql" -print0 | while read -rd $'\0' file; do
        nohup psql -d db -f "$file" >& "${file%.*}.out" &
    done
else
    echo "$1 is no directory"
    exit 1
fi
exit 0

称它为script.sh somedir.

于 2013-02-21T21:29:31.723 回答