无法将 bash 输出重定向到变量文件名

无法将 bash 输出重定向到变量文件名

我正在尝试将 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获取值。unknownif

另外,您-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

相关内容