我正在尝试编写一个脚本来收集一些有关磁盘运行状况的信息,作为自定义 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/nvme0n1
printf:106: %\n: invalid directive
printf "$disk_health"
我尝试回显$name
,它正确显示了磁盘名称及其路径。我还尝试$name
用"$name"
and echo $name
(在反引号之间)替换,但输出相同。
我正在 Debian bookworm 上使用 zsh 运行脚本。
答案1
您的 JSON 处理保留双引号,它们按原样传递到smartctl
.您需要使用jq
的-r
选项删除它们:
disk_names+=($(jq -r '.blockdevices[] | .name' <<< "$disk_info"))