如何使用2个列表文件创建for循环

时间:2019-06-20 19:57:30

标签: list shell for-loop unix

我试图用两个列表文件创建一个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

1 个答案:

答案 0 :(得分:1)

您可以这样做:

Public Sub Test()
    Dim foo As Long

    DoSomething (foo) ' evaluates the expression, passes the result of that expression
    Debug.Print foo ' prints 0

    DoSomething foo ' passes a reference to the local variable
    Debug.Print foo ' prints 42
End Sub

Private Sub DoSomething(ByRef value As Long)
    value = 42
End Sub

[Live demo]

使用输入重定向,可以同时打开两个文件,以进行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 循环。文件描述符0(标准输入)可用,但文件描述符1和2(分别为标准输出/标准错误)可用。下一个免费文件描述符是3。

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

重复此操作,直到其中一个文件用完为止。


顺便问一下,您should not attempt to read lines with for