Как выполнить команду в скрипте bash?

Как выполнить команду в скрипте bash?

Я пишу скрипт, который будет непрерывно передавать некоторые данные на порт 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выведет все свои аргументы на терминал.

Скриншот из bash с выполненной командой выше

При этом вот эта строка:

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на терминал Вся строка будет выполнена, аргумент выведен.

Вторая команда, выполненная в bash

Это все еще выглядит запутанным, поэтому давайте немного упростим: пусть наша команда будет echo 'echo -n -e "blah"'.

команда blah запущена в bash

Вы сказали ему вывести команду, поэтому он вывел команду. Отбросьте внешний, 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 просто заменит переменные перед выполнением команды, поэтому ввод имени переменной приведет к выполнению ее содержимого.

Связанный контент