이것은 내 코드입니다.
#!/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
바꾸지 않습니다 .$location
NYC
Paris
Tokyo
묻다:$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
다음 두 가지 작업을 수행해야 합니다.
- 통화에 백틱이 필요하지 않습니다.
mosquitto_pub
- 매개
-t
변수는mosquitto_pub
작은따옴표("
) 대신 큰따옴표( ) 로"
묶어야 합니다.
특히 (2) 이것이 문제의 원인입니다. 작은따옴표는 $
변수 평가를 허용하지 않습니다.
if ...
then
#change location of machine
mosquitto_pub -t "/${user_defined_new_machine_location}/cmd" -m '-changelocation'
...
답변3
roaima가 주석에서 말했듯이, 확장하려는 변수에 대해 큰따옴표를 사용해야 합니다(따라서 "$location"
). 작은따옴표는 변수가 확장되는 것을 방지하기 때문입니다.