Bash ネストされたコマンド置換は機能しません。

Bash ネストされたコマンド置換は機能しません。

こんにちは。実行するbashスクリプトがあります。watch ./script.sh

ノートブックの冷却問題をデバッグするためのものでしたが、私が書いたスクリプトは期待どおりに機能しませんでした。私はbashスクリプトに初めて触れたので、簡単だと確信しています。

私のスクリプトに入れ子になったコマンド置換がある行がありますが、内部コマンドが機能していないように見えるか、少なくとも内部コマンドが値を知らないようです$i。助けてくれてありがとう。

スクリプトは次のとおりです。

echo "THERMAL ZONE 2:"
echo "Cur Temp: $(cat /sys/class/thermal/thermal_zone2/temp)"

for i in {2..7}
do
echo "cooling_device$i STATE: $(cat /sys/class/thermal/thermal_zone2/cdev$i/cur_state) TRIP POINT TEMP: $(cat /sys/class/thermal/thermal_zone2/trip_point_$(cat /sys/class/thermal/thermal_zone2/cdev$i_trip_point)_temp)"
done

出力は次のとおりです。

THERMAL ZONE 2:
Cur Temp: 43000
cat: /sys/class/thermal/thermal_zone2/cdev: No such file or directory
cat: /sys/class/thermal/thermal_zone2/trip_point__temp: No such file or directory
cooling_device2 STATE: 1 TRIP POINT TEMP: 
cat: /sys/class/thermal/thermal_zone2/cdev: No such file or directory
cat: /sys/class/thermal/thermal_zone2/trip_point__temp: No such file or directory
cooling_device3 STATE: 1 TRIP POINT TEMP: 
cat: /sys/class/thermal/thermal_zone2/cdev: No such file or directory
cat: /sys/class/thermal/thermal_zone2/trip_point__temp: No such file or directory
cooling_device4 STATE: 0 TRIP POINT TEMP: 
cat: /sys/class/thermal/thermal_zone2/cdev: No such file or directory
cat: /sys/class/thermal/thermal_zone2/trip_point__temp: No such file or directory
cooling_device5 STATE: 0 TRIP POINT TEMP: 
cat: /sys/class/thermal/thermal_zone2/cdev: No such file or directory
cat: /sys/class/thermal/thermal_zone2/trip_point__temp: No such file or directory
cooling_device6 STATE: 0 TRIP POINT TEMP: 
cat: /sys/class/thermal/thermal_zone2/cdev: No such file or directory
cat: /sys/class/thermal/thermal_zone2/trip_point__temp: No such file or directory
cooling_device7 STATE: 0 TRIP POINT TEMP:

答え1

私が見た最も明白な間違いは、iループ変数を保護しないことです。そのため、作成時にシェルは未設定の$i_trip_point変数を探しているため、2番目の型のエラーが発生します。たとえば、次のようになります。i_trip_point

cat: /sys/class/thermal/thermal_zone2/trip_point__temp: No such file or directory

point間にある2つの下線は、挿入される空のtemp変数を示します。構文を使用する必要があります${i}_trip_point。中括弧は、変数名の一部として解釈される隣接する文字から変数を保護します。

関連情報