for loop - 使用单个文件作为输入的双变量

时间:2016-08-31 14:02:37

标签: bash for-loop

我熟悉一个基本的for循环。比如这样:

#!/bin/bash

hosts=$(< file)

for h in $hosts; do "some-command" "$h"
done

但是..我有一个格式化的文本文件,它是使用paste命令创建的,并排列成两列。

 paste file1 file2 | column -s $'\t' -t > combinedfile

该文件如下所示:

line1column1               line1column2       
line2column1               line2column2 
line3column1               line3column2 

我需要的是将此文件提供给for循环脚本并一次传入一行,使用column1的数据作为第一个变量,将column2的数据作为第二个变量。

像这样的东西

#!/bin/bash

hosts=$(< file)

for h i in $hosts; do "some-command" "$h" "i"
done

其中“h”等于第1行第1列,“i”等于第1行第2列。这样做的正确方法是什么?

更新:在使用Tom的方法时,我设置了我的脚本但它在第一行工作然后退出。

以下是我的设置:

#!/bin/bash

doit="/pathtocommand"
file="/pathtosourcefile"

while read -r username password; do

$doit "$username" "$password"

done < $file

想法?

更新2:

我也希望发布我的期望剧本。这是在while循环中运行的“命令”。

#!/usr/bin/expect -f 

## Set up variables to be passed in as command line arguments
#set username [lindex $argv 0];
#set password [lindex $argv 1];
lassign $argv username password

spawn telnet 192.168.100.101 106
expect "200 PWD Server ready"    
send "USER user\r"
expect "300 please send the PASS"
send "PASS password\r"
expect "200 login OK, proceed"

## Use the line below for passwords that do not have to be enclosed with quotes
send "SETACCOUNTPASSWORD $username PASSWORD $password\r"

# Use the line below for a password that must be quoted ie one that   contains a $ or a ! by escaping the double quotes
#send "SETACCOUNTPASSWORD $username PASSWORD \"$password\"\r"

expect "200 OK"
send "quit\r"
interact

我过去使用过相同的期望脚本和SSH以及没有问题的常规for循环。可能是我需要修改或更改的期望脚本中的内容吗?

2 个答案:

答案 0 :(得分:3)

为文件中的每一行执行一组操作的方法是使用while read循环:

while read -r host something_else; do
    some_command "$host" "$something_else"
done < file

每一行都由shell拆分,变量$host$something_else设置为字段的值。

几乎总是应该使用-r选项,因为它告诉shell不要尝试用输入中的转义序列做任何聪明的事情。

答案 1 :(得分:2)

如果您要创建输入文件(而不仅仅是从其他地方获取),请注意您可以使用原始的两个文件:

   [j for i,j in enumerate(a) if i not in b ]