Estou escrevendo um script que transmitirá continuamente alguns dados para a porta 30000, para que um ouvinte python udp possa obter os dados e inseri-los em uma tabela, da qual posso extrair essas informações e exibi-las em uma página da web.
Então, eu quero executar
echo -n -e "\x00\x00\x0A\x00 1 012601234512345\x00" | nc -w1 -u localhost 3000
no script bash em um loop while.
Este é o script bash que tenho até agora:
#!/bin/bash
echo 'Running Script'
a=0
x=1
while [ $a -le 1 ]
do
echo 'echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
sleep 5
let x=$(($x + 1))
done
A variável x aumenta a cada vez ao longo do loop, de modo que os dados mudam a cada vez.
No momento estou pensando que, em vez de enviar isso como um comando para o terminal, está apenas saindo como uma string. Sou muito novo no bash e qualquer ajuda seria muito apreciada.
Responder1
Você está pensando demais.
Basta colocar ali o comando que deseja executar, sem citá-lo ou echo
indicá-lo. Substitua a variável por ${x}
. As variáveis serão substituídas por strings entre aspas duplas e isso {}
existe para garantir que sua variável seja interpretada como x
e não x12345
.
#!/bin/bash
echo 'Running Script'
a=0
x=1
while [ $a -le 1 ]
do
echo -n -e "\x00\x00\x0A\x00 1 012601234${x}12345\x00" | nc -w1 -u localhost 30000
sleep 5
let x=$(($x + 1))
done
Responder2
Na verdade, você está repetindo o comando em vez de executá-lo.
Os scripts Bash são executados linha por linha como comandos. Então esta linha:
echo 'Running Script'
é um equivalente exato de digitar echo 'Running Script'
no shell. Experimente você mesmo: a saída será Running Script
. Conclusão: echo
irá enviar todos os seus argumentos para o terminal.
Dito isto, esta linha:
echo 'echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
será enviado echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000
para o terminal. A linha inteira é executada, o argumento é gerado.
Ainda parece confuso, então vamos simplificar um pouco: deixe nosso comando ser echo 'echo -n -e "blah"'
.
Você disse para ele gerar o comando, então ele gerou o comando. Solte o exterior echo
para executá-lo. Comoslhck sugerido, você pode usar a variável envolvendo-a entre chaves:
echo -n -e "\x00\x00\x0A\x00 1 012601234${x}12345\x00" | nc -w1 -u localhost 30000
Ele executará o comando, mas não o produzirá. Se você deseja gerar o comando, tente isto:
cmd="echo -n -e \"\x00\x00\x0A\x00 1 012601234${x}12345\x00\" | nc -w1 -u localhost 30000"
echo $cmd
$cmd
A primeira linha atribui seu comando a uma cmd
variável, a segunda linha o gera e a terceira o executa. Parece confuso no começo, mas é bem simples: o bash apenas substituirá as variáveis antes de executar um comando, então digitar o nome da variável fará com que seu conteúdo seja executado.