Я пишу сценарий, который будет непрерывно транслировать некоторые данные на порт 30000, чтобы слушатель udp Python мог получить данные и вставить их в таблицу, из которой я могу извлечь эту информацию и отобразить на веб-странице.

Итак, я хочу выполнить

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, и любая помощь будет принята с благодарностью.

2 ответа2

4

Вы действительно повторяете команду, а не выполняете ее.

Скрипты Bash выполняются одна за другой в виде команд. Итак, эта строка:

echo 'Running Script'

Точный эквивалент ввода echo 'Running Script' в оболочке. Попробуйте сами: он выведет Running Script . Вывод: echo выведет все свои аргументы на терминал.

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

Как говорится, эта строка:

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"' .

бла команда побежал в Баш

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

3

Вы переосмысливаете это.

Просто поместите команду , которую вы хотите выполнить там, не приводя его или echo ИНГ его. Замените переменную на ${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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .