Linux システムの HDD の数を数えようとしています。次の行をまとめました。
findhdds=$(find /sys/block -name 'sd*' | wc -l)
'find /sys/block -name 'sd*' | wc -l' しかし、それを変数に格納しようとすると、読み返すときに次のメッセージが表示されます。
3: command not found
私がどこで間違っているのか誰でも理解できますか?
コマンドを変数に格納する場合、この変数を直接呼び出すと結果が実行されます。そのため、コマンド3を起動しようとしていますが、これは明らかに存在しません。結果を確認するには、変数を出力する必要があります。echo $ findhdds
作成されたフォーマット済み出力のいくつかのバージョン/実装と、wc
試してみる値の前にスペースを入れてください。
$ wc -l < <(find /sys/block/ -name 'sd*')
3
wc
の出力にはスペースが含まれていることに注意してください。今試してみてください:
$ findhdds= 3
bash: 3: command not found
SOの質問で報告されたエラーを取得します。
findhdds=$((0+$(find /sys/block/ -name 'sd*' | wc -l)))
または(私はこれが好きです):
findhdds=$[$(find /sys/block/ -name 'sd*' | wc -l)]
それらは両方とも変数にのみ数値を格納します:
echo $findhdds
3
あなたは何をするためにbashを使うことができますwc
:
$ findhdds=($(find /sys/block/ -name 'sd*'))
$ echo $findhdds
/sys/block/sda
$ echo ${#findhdds[@]}
3
$ echo ${findhdds[2]}
/sys/block/sdc
まったく、この特定のケースでは、ジョブ全体にbashを使用できます。
findhdds=(/sys/block/sd*)
echo ${#findhdds[@]}
3
echo ${!findhdds[@]}
0 1 2
echo ${findhdds[@]}
/sys/block/sda /sys/block/sdb /sys/block/sdc
echo ${findhdds[0]}
/sys/block/sda
echo ${findhdds[0]##*/}
sda
echo ${findhdds[@]##*/}
sda sdb sdc
for devnam in ${findhdds[@]##*/} ; do
printf "Doing something with device: %s...\n" $devnam
done
Doing something with device: sda...
Doing something with device: sdb...
Doing something with device: sdc...
これを試してください:
findhdds=`find /sys/block/ -name 'sd*' | wc -l`
お役に立てれば!