1

Linux システムの HDD の数を数えようとしています。次の行をまとめました。

findhdds=$(find /sys/block -name 'sd*' | wc -l)

'find /sys/block -name 'sd*' | wc -l' しかし、それを変数に格納しようとすると、読み返すときに次のメッセージが表示されます。

3: command not found

私がどこで間違っているのか誰でも理解できますか?

4

3 に答える 3

3

コマンドを変数に格納する場合、この変数を直接呼び出すと結果が実行されます。そのため、コマンド3を起動しようとしていますが、これは明らかに存在しません。結果を確認するには、変数を出力する必要があります。echo $ findhdds

于 2012-10-25T15:15:49.467 に答える
2

バグの説明

作成されたフォーマット済み出力のいくつかのバージョン/実装と、wc試してみる値の前にスペースを入れてください。

$ wc -l < <(find /sys/block/ -name 'sd*')
  3

wcの出力にはスペースが含まれていることに注意してください。今試してみてください:

$ findhdds= 3
bash: 3: command not found

SOの質問で報告されたエラーを取得します。

2つの解決策(およびそれ以上...):

.1答えを計算して、これが数値になるようにします。

findhdds=$((0+$(find /sys/block/ -name 'sd*' | wc -l)))

または(私はこれが好きです):

findhdds=$[$(find /sys/block/ -name 'sd*' | wc -l)]

それらは両方とも変数にのみ数値を格納します:

echo $findhdds 
3

.2デバイス名を配列に格納し、メンバーをカウントします。

あなたは何をするために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...
于 2012-10-25T17:31:40.970 に答える
-1

これを試してください:

findhdds=`find /sys/block/ -name 'sd*' | wc -l`

お役に立てれば!

于 2012-10-25T08:41:05.927 に答える