端末で直接smartctlを実行するときと、スクリプトでsmartctlを実行するときに潜在的な変数拡張の問題を説明できる人はいますか?

端末で直接smartctlを実行するときと、スクリプトでsmartctlを実行するときに潜在的な変数拡張の問題を説明できる人はいますか?

ShredOSカスタマイズの一部としてディスクの状態に関するいくつかの情報を収集するスクリプトを作成しようとしています。次のコードスニペットの問題を理解できません。

    #get disk info
    disk_info=$(lsblk --path -AdJo NAME,SIZE,ROTA)

    #get names of disks
    disk_names+=($(jq '.blockdevices[] | .name' <<< "$disk_info"))

    printf "\n\n# DISK HEALTH REPORTS #\n\n"
    for name in ${disk_names[@]};
      do
              #this command works in shell but cannot find device type when run through the script.
              disk_health=$(sudo smartctl -s on -a "$name")
              printf "$disk_health"
      done

実行すると、次の結果が表示されます。

"/dev/nvme0n1": Unable to detect device type
Pleas specify device type with the -d option.

sudo smartctl -s on -a /dev/nvme0n1しかし、シェルでコマンドを実行すると、目的の出力が得られます。スクリプトを置き換えると、$name必要な出力も得られます。 (行番号(106)に対応する警告がありますが)/dev/nvme0n1printf:106: %\n: invalid directiveprintf "$disk_health"

echoを試しましたが、$nameディスク名とパスが正しく表示されます。また、(バックティック間)$nameに置き換えようとしましたが、出力は同じです。"$name"echo $name

私はDebian bookwormでzshを使ってスクリプトを実行しています。

答え1

JSONハンドラは二重引用符を保持し、そのまま渡されます。オプションをsmartctl使用して削除する必要があります。jq-r

disk_names+=($(jq -r '.blockdevices[] | .name' <<< "$disk_info"))

関連情報