Я пишу скрипт, который будет непрерывно передавать некоторые данные на порт 30000, чтобы прослушиватель Python UDP мог получить данные и вставить их в таблицу, из которой я смогу извлечь эту информацию и отобразить на веб-странице.
Итак, я хочу выполнить
echo -n -e "\x00\x00\x0A\x00 1 012601234512345\x00" | nc -w1 -u localhost 3000
в скрипте bash в цикле while.
Вот скрипт bash, который у меня есть на данный момент:
#!/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
Переменная x увеличивается каждый раз на протяжении цикла, поэтому данные каждый раз изменяются.
В данный момент я думаю, что вместо того, чтобы выводить это как команду на терминал, это просто выходит как строка. Я совсем новичок в bash, и любая помощь будет высоко оценена.
решение1
Вы слишком много об этом думаете.
Просто поместите туда команду, которую вы хотите выполнить, не заключая ее в кавычки и не echo
используя ing. Замените переменную на ${x}
. Переменные будут подставлены в строки, заключенные в двойные кавычки, а , {}
чтобы убедиться, что ваша переменная интерпретируется как , x
а не 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
решение2
Вы действительно повторяете команду вместо того, чтобы выполнить ее.
Скрипты Bash выполняются построчно как команды. Так что эта строка:
echo 'Running Script'
является точным эквивалентом ввода echo 'Running Script'
в shell. Попробуйте сами: выведет Running Script
. Вывод: echo
выведет все свои аргументы на терминал.
При этом вот эта строка:
echo 'echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000'
выведет echo -n -e "\x00\x00\x0A\x00 1 012601234'$x'12345\x00" | nc -w1 -u localhost 30000
на терминал Вся строка будет выполнена, аргумент выведен.
Это все еще выглядит запутанным, поэтому давайте немного упростим: пусть наша команда будет echo 'echo -n -e "blah"'
.
Вы сказали ему вывести команду, поэтому он вывел команду. Отбросьте внешний, echo
чтобы выполнить его вместо этого. Какslhck предложил, вы можете использовать переменную, заключив ее в фигурные скобки:
echo -n -e "\x00\x00\x0A\x00 1 012601234${x}12345\x00" | nc -w1 -u localhost 30000
Он выполнит команду, но не выведет ее. Если вы хотите вывести команду, попробуйте это:
cmd="echo -n -e \"\x00\x00\x0A\x00 1 012601234${x}12345\x00\" | nc -w1 -u localhost 30000"
echo $cmd
$cmd
Первая строка присваивает вашу команду переменной cmd
, вторая строка выводит ее, а третья выполняет. На первый взгляд это выглядит запутанным, но на самом деле все довольно просто: bash просто заменит переменные перед выполнением команды, поэтому ввод имени переменной приведет к выполнению ее содержимого.