我正在尝试将 bash 输出重定向到变量文件名。这是我的脚本看起来像
#!/bin/bash
for i in `cat servers`
do
if [ "$i" = "198.162.1.3" ];
then
var="apple"
fi
ssh test@$i "uname -n"
done > /tempout/uname_${var}.txt
我得到的文件名是 /tempout/uname_.txt
预期的文件名应为 uname_apple.txt
答案1
代码中的变量var
在循环开始创建输出文件之前使用。
如果要将命令的结果输出ssh
到您构建的名称的文件中$var
,请执行以下操作:
#!/bin/bash
while read -r server; do
if [ "$server" = "198.162.1.3" ]; then
var='apple'
else
var='unknown'
fi
ssh -n "test@$server" 'uname -n' >"/tempout/uname_$var.txt"
done <servers
在这里,我还更改了循环,以便它逐行读取输入文件(忽略每行的前导和尾随空格),并且如果语句不采用“true”分支,我就var
获取值。unknown
if
另外,您-n
需要ssh
.否则,ssh
将消耗所有可用的输入(此处从文件重定向servers
)。
可以进行的另一个更改是使用case ... esac
而不是if
语句,特别是如果您测试的 IP 地址数量超过几个:
#!/bin/bash
while read -r server; do
case $server in
198.162.1.3) var=apple ;;
198.162.1.5) var=cottage ;;
198.162.1.7) var=bumblebee ;;
*) var=unknown
esac
ssh -n "test@$server" 'uname -n' >"/tempout/uname_$var.txt"
done <servers