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/nvme0n1
printf:106: %\n: invalid directive
printf "$disk_health"
echoを試しましたが、$name
ディスク名とパスが正しく表示されます。また、(バックティック間)$name
に置き換えようとしましたが、出力は同じです。"$name"
echo $name
私はDebian bookwormでzshを使ってスクリプトを実行しています。
答え1
JSONハンドラは二重引用符を保持し、そのまま渡されます。オプションをsmartctl
使用して削除する必要があります。jq
-r
disk_names+=($(jq -r '.blockdevices[] | .name' <<< "$disk_info"))