バックティックが変数を変数として受け入れる方法は?

バックティックが変数を変数として受け入れる方法は?

これは私のコードです。

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

次の 2 つの作業を行う必要があります。

  1. 通話にバックティックは必要ありません。mosquitto_pub
  2. パラメータ-tmosquitto_pub一重引用符(")ではなく二重引用符()で"囲む必要があります。

特に(2)これが問題の原因です。一重引用符は$変数の評価を許可しません。

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

答え3

roaimaがコメントしたように、拡張したい変数に二重引用符を使用する必要があります(したがって"$location")。一重引用符は、変数が拡張されるのを防ぐためです。

関連情報