0

我正在尝试使用两个列表文件创建一个 for 循环,这些文件基本上会回显脚本以更改多个数据库的 dbowner。列表文件包含多个服务器,登录名列表包含多个登录名。但它们是行分隔的,以便将每个数据库与登录名匹配。

这是我到目前为止所拥有的,但它显然是采用第一个服务器名称并通过每个登录名循环它,然后移动到下一个服务器名称。

for servername in $(cat servername.list); do
   for loginname in $(cat loginname.list); do
    echo "USE $servername"
    echo "go"
    echo "EXEC sp_changedbowner '$loginname'"
    echo "go"
    echo "USE master"
    echo "go"
    echo ""
   done
done

我希望输出是这样的:

    USE server1
    go
    EXEC sp_changedbowner 'login1'
    go
    USE master
    go

    USE server2
    go
    EXEC sp_changedbowner 'login2'
    go
    USE master
    go
4

1 回答 1

1

你可以这样做:

while read -r; do
    server="$REPLY"
    read -r <&3 || break
    login="$REPLY"
    echo \
"USE $server
go
EXEC sp_changedbowner '$login'
go
USE master
go
"
done <servername.list 3<loginname.list

[现场演示]

while使用输入重定向,您可以在循环中同时打开两个文件。文件描述符 0(标准输入)可用,但使用 1 和 2(分别为标准输出/标准错误)。下一个空闲文件描述符是 3。

然后循环首先从 0 读取一行(标准输入,现在连接到servername.list),然后从 3 读取一行(现在连接到loginname.list)。read将输入放在一个名为 的变量REPLY中,我们将其分别复制到serverlogin。这些变量在echo字符串中用于产生所需的输出。

重复此过程,直到其中一个文件用完行。


顺便说一句,您不应该尝试阅读带有for.

于 2019-06-20T20:15:39.917 回答