添加带有 echo 的文本,但如果文件不为空,则从新行开始

添加带有 echo 的文本,但如果文件不为空,则从新行开始

我正在尝试创建下一个脚本

echo "#!/bin/sh" >/script
echo "del x.txt" >>/script

如果 /script 文件为空,女巫就可以,如果不是 - 会将第一行附加到最后一个文本

#!/bin/sh
del x.txt#!/bin/sh
del x.txt

如果我先添加一个 echo 空行,如果文件不为空,则再次可以,但如果为空 - 脚本将不会被执行

echo "" >>/script
echo "#!/bin/sh" >>/script
echo "del x.txt" >>/script

编辑:

我将准确解释我想要做什么,在我的 asuswrt 路由器上,我想向端口转发脚本添加新规则,女巫是防火墙启动

echo "#!/bin/sh" >/jffs/scripts/firewall-start
echo "" >>/jffs/scripts/firewall-start
echo "iptables -I INPUT -p tcp --destination-port 3000 -j ACCEPT" >>/jffs/scripts/firewall-start

这将覆盖 /jffs/scripts/firewall-start 中的任何文本

我想要一个从头开始创建脚本或附加此行但从新行开始而不是将文本附加到最后一行的解决方案。如果我以空行开头并且脚本为空,则不会执行,因为 #!/bin/sh 应该位于第一行

echo "" >>/jffs/scripts/firewall-start
echo "#!/bin/sh" >/jffs/scripts/firewall-start
echo "" >>/jffs/scripts/firewall-start
echo "iptables -I INPUT -p tcp --destination-port 3000 -j ACCEPT"

/jffs/scripts/firewall-start

答案1

您可以使用 unix 测试文件是否为空test -s。下面的例子...

 if [ -s $file ]
then
   echo "File size is zero"
else
   echo "File size is not zero"
fi

答案2

我尝试重新生成该案例,并发现如果文件中的最后一行未以以下内容结束newline(例如,如果echo -n '#!/bin/bash' > /script使用的话,可能会发生在哪里),该操作echo "del x.txt" >>/script可以生成

cat /script
#!/bin/bashdel x.txt

为了避免这种情况,你可以sed使用echo

sed -i '$a\del x.txt' /script

-i --in-place输入文件修改

$意思是最后一行

a附加命令

答案3

您可以从文件中获取第一行,例如:

read -r varname <file

如果文件包含少于一个\newline - 或者文件不存在,或者无法读取 - 上述命令将返回 0 以外的值。否则它将返回 0 并$varname包含文件的第一行。

事实上,如果由于任何原因无法读取该文件,重定向<doesntexist很可能会终止脚本化 shell,因为<语法是运算符而不是命令。然而,command <doesntexist将否定这种行为并将操作员的状态降级<到可靠的可测试条件。

所以,你可以这样做:

line1=
command read -r line1 <file && 
echo delx.txt >> file    ||
printf %s\\n '#!/bin/sh' "# $line1" delx.txt >file

它将附加到包含 ewline 的文件\n或在截断的文件的头部插入一个 hashbang,该文件随后包含注释的先前内容(如果有的话并且没有 NUL 字节)文件,然后是\newline,最后是字符串德尔克斯.txt接下来是另一条\neline。

要么它包含这些东西,要么脚本真的echo在或行上失败,printf因为您尝试写入的文件不可写 - 这可能是一件好事。

相关内容