我正在尝试创建下一个脚本
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
如果文件包含少于一个\n
ewline - 或者文件不存在,或者无法读取 - 上述命令将返回 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 字节)的文件,然后是\n
ewline,最后是字符串德尔克斯.txt接下来是另一条\n
eline。
要么它包含这些东西,要么脚本真的做echo
在或行上失败,printf
因为您尝试写入的文件不可写 - 这可能是一件好事。