有人可以解释从脚本运行 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但是当我在 shell 中运行该命令时,我得到了所需的输出。如果我在脚本中替换$name为,我也会得到所需的输出(尽管在对应于的行号(106)上有一个警告)/dev/nvme0n1printf:106: %\n: invalid directiveprintf "$disk_health"

我尝试回显$name,它正确显示了磁盘名称及其路径。我还尝试$name"$name"and echo $name(在反引号之间)替换,但输出相同。

我正在 Debian bookworm 上使用 zsh 运行脚本。

答案1

您的 JSON 处理保留双引号,它们按原样传递到smartctl.您需要使用jq-r选项删除它们:

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

相关内容