これは私のコードです。
#!/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
次の 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"
)。一重引用符は、変数が拡張されるのを防ぐためです。