将用户输入写入文件

时间:2015-06-26 15:24:30

标签: bash

我正在尝试将信息保存到文件中,但我只是在最后一行。

我保存输出的方法> $fqdn_alias.decom是错误的吗?

qdn_alias=$(hostname --alias)
blade_sn=$(dmidecode -t system | grep "Serial Number")
blade_slot=$(dmidecode | grep "Location In")
wwn_ports=/tmp/wwn.txt
port_name=$(cat /sys/class/fc_host/host[0-9]/port_name)
# store wwn ports
echo "$port_name" > $wwn_ports
# output
echo "Server Alias:" $fqdn_alias > $fqdn_alias.decom
echo "" > $fqdn_alias.decom
echo "WWN" > $fqdn_alias.decom
sed 's/\(..\)/\1:/g;s/:$//' $wwn_ports > $fqdn_lias.decom
echo "" > $fqdn_alias.decom
echo "$blade_slot" > $fqdn_alias.decom
echo "$blade_sn" > $fqdn_alias.decom

2 个答案:

答案 0 :(得分:2)

每次使用>时,它会在写入文件之前截断文件。因此,如果您连续多次执行此操作,则会反复清空文件。

最佳解决方案是仅打开文件以写入一次

一种选择是使用块对命令进行分组,如下所示:

{    
    echo "Server Alias: $fqdn_alias"
    echo ""
    echo "WWN"
    sed 's/\(..\)/\1:/g;s/:$//' "$wwn_ports"
    echo ""
    echo "$blade_slot"
    echo "$blade_sn"    
} > "$fqdn_alias.decom"

使用此方法,仅打开文件一次。作为奖励,我在您的变量周围添加了一些健康的引用,这总是一个好主意。

或者,您可以使用heredoc:

cat <<EOF >"$fqdn_alias.decom"
Server Alias: $fqdn_alias

WWW
$(sed 's/\(..\)/\1:/g;s/:$//' "$wwn_ports")

$blade_slot
$blade_sn
EOF

最多EOF的行被重定向到该文件。在我看来,这个选项更好,因为它避免了对echo的这么多调用并允许你使用换行符。命令替换用于添加sed命令的输出。

答案 1 :(得分:1)

每次使用>重定向时,它都会覆盖现有文件。如果你想要附加到文件,请使用>>,所以你的行应该是

sed 's/\(..\)/\1:/g;s/:$//' $wwn_ports >> $fqdn_lias.decom

如果您不担心开销并重定向输出,那么您可以在块/子shell中完成所有操作

( echo "Server Alias:" $fqdn_alias 
echo ""
echo "WWN" 
sed 's/\(..\)/\1:/g;s/:$//' $wwn_ports
echo "" 
echo "$blade_slot" 
echo "$blade_sn" ) > $fqdn_alias.decom