我试图用两个列表文件创建一个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
答案 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
使用输入重定向,可以同时打开两个文件,以进行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
的变量中,我们分别将其复制到REPLY
和server
中。这些变量用于login
字符串中以产生所需的输出。
重复此操作,直到其中一个文件用完为止。