如何使反引号接受变量作为变量?

如何使反引号接受变量作为变量?

这是我的代码:

#!/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为 like NYCParisor 的初始化值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

您需要做两件事:

  1. 你不需要在调用周围加反引号mosquitto_pub
  2. 您的-t参数 tomosquitto_pub应该用双引号 ( ") 而不是单引号 ( ")括起来

特别是 (2) 这是您的问题的原因。单引号不允许对$变量求值。

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

答案3

正如 roaima 在评论中所说,您应该对想要扩展的变量使用双引号(因此,"$location"),因为单引号可以保护变量不被扩展。

相关内容