Você pode testar para ver se um arquivo está vazio usando unix test -s
. Exemplo abaixo ...
if [ -s $file ]
then
echo "File size is zero"
else
echo "File size is not zero"
fi
Estou tentando criar o próximo script
echo "#!/bin/sh" >/script
echo "del x.txt" >>/script
a bruxa está ok se o arquivo / script estiver vazio, se não estiver - irá anexar a primeira linha ao último texto
#!/bin/sh
del x.txt#!/bin/sh
del x.txt
Se eu adicionar uma linha vazia de eco primeiro, tudo bem se o arquivo não estiver vazio, mas se estiver vazio - o script não será executado
echo "" >>/script
echo "#!/bin/sh" >>/script
echo "del x.txt" >>/script
EDITAR:
Vou explicar exatamente o que estou tentando fazer, no meu roteador asuswrt eu quero adicionar uma nova regra ao script de encaminhamento de porta, que é o 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
Isso sobrescreverá qualquer texto em / jffs / scripts / firewall-start
Eu quero uma solução para criar script a partir do zero ou para anexar essas linhas, mas começando com uma nova linha e não para acrescentar texto à última linha. Se eu começar com a linha vazia e o script estiver vazio, não será executado depois porque #! / Bin / sh deve estar na primeira linha
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
Você pode testar para ver se um arquivo está vazio usando unix test -s
. Exemplo abaixo ...
if [ -s $file ]
then
echo "File size is zero"
else
echo "File size is not zero"
fi
Eu tentei reproduzir o caso e descobri que no caso em que a última linha no arquivo não termina com newline
(onde pode acontecer, por exemplo, se echo -n '#!/bin/bash' > /script
usou) a operação echo "del x.txt" >>/script
pode produzir
cat /script
#!/bin/bashdel x.txt
Para evitar isso, você pode usar sed
em vez de echo
sed -i '$a\del x.txt' /script
-i
--in-place
modificação do arquivo de entrada
$
significa a última linha
a
append command
Você pode obter a primeira linha de um arquivo como:
read -r varname <file
No caso de um arquivo conter menos de um \n
ewline - ou se o arquivo não existir ou não puder ser lido - o comando acima retornará diferente de 0. Caso contrário, ele retornará 0 e $varname
conterá a primeira linha do arquivo.
De fato, se o arquivo não puder ser lido por algum motivo, o redirecionamento <doesntexist
provavelmente matará um shell com script porque a sintaxe <
é um operador e não um comando. No entanto, command <doesntexist
negará esse comportamento e rebaixará o status do operador <
para uma condição testável de forma confiável.
E assim, você pode fazer:
line1=
command read -r line1 <file &&
echo delx.txt >> file ||
printf %s\n '#!/bin/sh' "# $line1" delx.txt >file
O qual seria anexado a um arquivo contendo um \n
ewline ou inserir um hashbang na cabeça de um arquivo truncado que contenha o conteúdo anterior comentado (se houver alguma coisa e sem bytes NUL) de arquivo , depois um \n
ewline e a última string delx.txt seguido por outro \n
ewline.
Ele conteria essas coisas ou o script realmente falha na linha echo
ou printf
porque o arquivo que você está tentando gravar não é gravável por você - o que é provavelmente uma coisa boa.
Tags files echo shell-script