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 问题中报告的错误。

两种解决方案(以及更多...):

.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 回答