Adicione texto com eco mas comece com nova linha se o arquivo não estiver vazio

4

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

    
por Gigi Duru 30.10.2014 / 20:46

3 respostas

1

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
    
por 30.10.2014 / 21:08
1

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

    
por 30.10.2014 / 22:20
0

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.

    
por 31.10.2014 / 01:32