我熟悉一个基本的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循环。可能是我需要修改或更改的期望脚本中的内容吗?
答案 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 ]