Como fazer backticks aceitam variáveis como variáveis?

0

Este é o meu código:

#!/bin/bash

machine_we_are_looking_for=$1
user_defined_new_machine_location=$2


condition_while_one=true
condition_while_two=true



echo "test 1"

while $condition_while_one
do




    first_awk_variables='tail -n1 /mydriectory/myonlycsvfile.csv | awk -F, '{print $3, $4, $5, $7, $10 }''
    first_awk_variables_value_array=($first_awk_variables)          #turns contents of 'first_awk_variables' into an array 'first_awk_variables_value_array'


  value_stat=${first_awk_variables_value_array[3]}

  machine_location=${first_awk_variables_value_array[0]}
  machine_ID=${first_awk_variables_value_array[1]}
  machine_No=${first_awk_variables_value_array[2]}
  machine_title=$machine_ID'-'$machine_No
  echo "$value_stat of $machine_title at $machine_location"

    if [ "$value_stat" == "status" ] && [ "$machine_title" == "$machine_we_are_looking_for" ]
        then


                 #change location of machine
                'mosquitto_pub -t '/$user_defined_new_machine_location/cmd' -m '-changelocation''

              condition_while_one=false   
        fi



done             

Com isso, quero "publicar" no fluxo do MQTT. A parte de publicação funciona muito bem, mas aceita o nome da variável $location literalmente e não substitui $location pelo valor inicializado como NYC , Paris ou Tokyo .

P: Como posso fazer com que o valor / string atribuído seja substituído por $location quando o código é executado

    
por 3kstc 27.03.2015 / 00:53

3 respostas

2

As strings entre aspas simples são usadas como estão. Em uma sequência de aspas simples, o único caractere especial é o caractere de aspas simples ' , que termina a string.

Em sequências entre aspas duplas, os caracteres "\ $ are special: " ends the string, 'fazem com que o próximo caractere perca sua interpretação especial, ' inicia uma substituição de comando e $ inicia uma substituição de variável, comando substituição ou expansão aritmética.Assim, desde que você deseja expandir as variáveis, use aspas duplas em vez de aspas simples.Isso não está relacionado ao uso de uma substituição de comando.

Além disso, a substituição de comandos não faz sentido no contexto. Você está pegando a saída do comando mosquitto_pub … , dividindo-a no espaço em branco, interpretando cada uma das palavras resultantes como um padrão glob e usando o resultado dessa expansão como um comando e seus argumentos. Não tenho certeza do que este programa está tentando fazer; Se você quiser apenas executar o comando mosquitto_pub , remova os backticks. Se você quiser atribuir sua saída a uma variável, você precisa escrever uma tarefa como

some_variable='mosquitto_pub -t "/$user_defined_new_machine_location/cmd" -m '-changelocation''

Em uma nota não relacionada, não use nomes de variáveis como condition_while_one . Este nome não tem sentido. Use um nome que reflete para o que a variável é usada. Para este exemplo específico, você não precisa da variável - faça isso:

while true; do
  …
  if …; then
    mosquitto_pub …
    break
  fi
done
    
por 27.03.2015 / 01:32
2

Duas coisas que você precisa fazer:

  1. você não precisa de backticks em torno de sua invocação de mosquitto_pub
  2. seu parâmetro -t para mosquitto_pub deve estar cercado por aspas duplas ( " ) em vez de aspas simples ( " )

Em particular (2), aqui está a causa do seu problema. Aspas simples não permitirão a avaliação de variáveis $ .

    if ...
    then
      #change location of machine
      mosquitto_pub -t "/${user_defined_new_machine_location}/cmd" -m '-changelocation'
       ...
    
por 27.03.2015 / 09:42
1

Como Roaima disse em um comentário, você deve usar aspas duplas para as variáveis que deseja expandir (assim, "$location" ), já que as aspas simples protegem as variáveis de serem expandidas.

    
por 27.03.2015 / 01:16

Tags