管道 echo、tail 和 sed 会导致错误的输出

Piping echo, tail and sed leads to wrong output

我想在 fstab 中添加一个条目,我在我的 /bin/bash 脚本中使用这个命令:

echo -n | tail -1 /mnt/etc/fstab | sed 's/\(-\).*/-03/' >> /mnt/etc/fstab
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "/home" >> /mnt/etc/fstab
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "ext4" >> /mnt/etc/fstab
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "default,noatime" >> /mnt/etc/fstab 
echo -e -n "\t" >> /mnt/etc/fstab  
echo -n "0" >> /mnt/etc/fstab 
echo -e -n "\t" >> /mnt/etc/fstab  
echo "2" >> /mnt/etc/fstab 

这是原文:

proc                  /proc           proc    defaults          0       0
PARTUUID=ee397c53-01  /boot           vfat    defaults          0       2
PARTUUID=ee397c53-02  /               ext4    defaults,noatime  0       1

这是预期的输出:

proc                  /proc           proc    defaults          0       0
PARTUUID=ee397c53-01  /boot           vfat    defaults          0       2
PARTUUID=ee397c53-02  /               ext4    defaults,noatime  0       1
PARTUUID=ee397c53-03  /home           ext4    defaults,noatime  0       2

而是输出如下:

proc                  /proc           proc    defaults          0       0
PARTUUID=ee397c53-01  /boot           vfat    defaults          0       2
PARTUUID=ee397c53-02  /               ext4    defaults,noatime  0       1
PARTUUID=ee397c53-03
    /home   ext4    default,noatime 0   2

管道有什么问题?

您的第一条线路已关闭。您正在管道 echo -ntailecho -n 不产生任何输出,因此您没有向 tail 传输任何内容。

您可以使用 echo -n 附加 tail | sed 命令的输出:

echo -n $(tail -1 /mnt/etc/fstab | sed 's/\(-\).*/-03/') >> /mnt/etc/fstab

tail | sed 位包装到 $() 允许 echo 获取这些命令的标准输出并将结果(不按需要换行)回显到 fstab。

或者,您可以使用 xargs 通过管道传输到回显,以便它可以从标准输入读取。

tail -1 /mnt/etc/fstab | sed 's/\(-\).*/-03/' | xargs echo -n >> /mnt/etc/fstab

此外,您可以使用 printf 来完成整个脚本:

printf "%s\t%s\t%s\t%s\t%s\t%s\n", $(tail -1 /etc/fstab | sed 's/\(-\).*/-03/') "/home" "ext4" "default,noatime" "0" "2"

以下内容也可能对您有所帮助。

awk -F'[- ]' 'END{val=sprintf("%02d",+1);print "-"val," /home           ext4    defaults,noatime  0       2"}'   Input_file

如果您对以上 awk 的结果满意,那么您也可以使用以下命令保存结果。

awk -F'[- ]' '1;END{val=sprintf("%02d",+1);print "-"val," /home           ext4    defaults,noatime  0       2"}' Input_file  > tmp && mv tmp Input_file