在工作中做一个简单的脚本,我无法弄清楚为什么它不会将结果输出到另一个文件中。
/tmp/system
存储节点列表
#!/bin/bash
$results=restest.txt
for i in $(cat /tmp/system); do
ping -c 1 $i
if [ $i = 0 ]; then
ssh $i ps -ef | grep ops | echo > $results
fi
done
答案 0 :(得分:2)
echo不是从stdin打印而是打印它的参数(如果没有参数,则为换行符)。所以
echo file.txt
只打印'file.txt',而不是文件的内容。因此,您的代码只会在文件中写入换行符。您可以使用cat将stdin打印到stdout,但这里没用,因为您可以将grep输出直接传递给文件:
ssh $i ps -ef | grep ops > $results
答案 1 :(得分:0)
首先感谢您编辑代码(这样更清楚:) 我有2或3个建议:
1-当你想在变量中存储一个值时不要使用" $" symbole,这个符号用于获取变量的值
前:
MYVAR=3 echo MYVAR "this will print MYVAR" echo $MYVAR "this will print 3"
2-总是引用你的值,特别是如果值来自另一个命令
3-要修复脚本,您需要引用远程计算机上执行的命令, 然后将输出重定向到您的文件
前:
ssh user@MachineA "ls > file.txt" "file.txt is created on machineA" ssh user@machineA "ls" > file.txt "file.txt is created on YOUR machine"
所以,您可以通过
替换最后一行ssh $i "ps -ef | grep ops" > $results
尝试在测试bash classictest
中使用-ne 祝你好运答案 2 :(得分:0)
有几个错误。首先,不要迭代这样的文件。其次,i
是主机的名称,而不是ping
的退出状态。第三,echo
是不必要的(并且不从标准输入读取)。最后,$
仅用于扩展参数,而不是用于分配参数。
#!/bin/bash
results=restest.txt
while read -r host; do
if ping -c 1 "$host"; then
ssh "$host" ps -ef | grep ops > "$results"
fi
done < /tmp/system