백틱이 변수를 변수로 받아들이도록 만드는 방법은 무엇입니까?

백틱이 변수를 변수로 받아들이도록 만드는 방법은 무엇입니까?

이것은 내 코드입니다.

#!/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             

이를 통해 MQTT 스트림에 "게시"하고 싶습니다. 게시 부분은 잘 작동하지만 변수 이름을 문자 그대로 사용하고 , 또는 같은 초기화된 값으로 $location바꾸지 않습니다 .$locationNYCParisTokyo

묻다:$location코드가 실행될 때 할당된 값/문자열이 대체 되도록 하려면 어떻게 해야 합니까?

답변1

작은따옴표 안의 문자열은 있는 그대로 사용됩니다. 작은따옴표로 묶인 문자열에서 유일한 특수 문자는 '문자열을 끝내는 작은따옴표 문자입니다.

큰따옴표로 묶인 문자열에서 "\$ are special:" ends the string,` 문자는 다음 문자의 특수 해석을 잃게 하고 `명령 대체를 시작하며 $변수 대체, 명령 대체 또는 산술 확장을 시작합니다. 따라서 변수를 확장하려면 이중 사용 대신 따옴표를 사용하면 명령 대체 사용과 아무 관련이 없습니다.

게다가 명령 대체는 상황에 따라 의미가 없습니다. command 의 출력을 가져와 mosquitto_pub …공백으로 분할하고 결과로 나오는 각 단어를 전역 패턴으로 해석하고 이 확장 결과를 명령 및 해당 인수로 사용합니다. 이 프로그램이 무엇을 하려는지 잘 모르겠습니다. 단지 명령을 실행하고 싶다면 mosquitto_pub백틱을 제거하세요. 출력을 변수에 할당하려면 다음과 같은 할당을 작성해야 합니다.

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

관련 없는 댓글에는 와 같은 이름을 사용하지 마세요 condition_while_one. 이 이름은 의미가 없습니다. 변수의 목적을 반영하는 이름을 사용하십시오. 이 특정 예에서는 변수가 전혀 필요하지 않습니다. 다음을 수행하십시오.

while true; do
  if …; then
    mosquitto_pub …
    break
  fi
done

답변2

다음 두 가지 작업을 수행해야 합니다.

  1. 통화에 백틱이 필요하지 않습니다.mosquitto_pub
  2. 매개 -t변수는 mosquitto_pub작은따옴표( ") 대신 큰따옴표( ) 로 "묶어야 합니다.

특히 (2) 이것이 문제의 원인입니다. 작은따옴표는 $변수 평가를 허용하지 않습니다.

    if ...
    then
      #change location of machine
      mosquitto_pub -t "/${user_defined_new_machine_location}/cmd" -m '-changelocation'
       ...

답변3

roaima가 주석에서 말했듯이, 확장하려는 변수에 대해 큰따옴표를 사용해야 합니다(따라서 "$location"). 작은따옴표는 변수가 확장되는 것을 방지하기 때문입니다.

관련 정보