这是我的代码:
#!/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 NYC
、Paris
or 的初始化值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
参数 tomosquitto_pub
应该用双引号 ("
) 而不是单引号 ("
)括起来
特别是 (2) 这是您的问题的原因。单引号不允许对$
变量求值。
if ...
then
#change location of machine
mosquitto_pub -t "/${user_defined_new_machine_location}/cmd" -m '-changelocation'
...
答案3
正如 roaima 在评论中所说,您应该对想要扩展的变量使用双引号(因此,"$location"
),因为单引号可以保护变量不被扩展。