无法回显内部变量的值" for loop"

时间:2016-02-22 16:29:55

标签: linux bash shell unix

我正在编写一个bash脚本来收集每台服务器的硬件信息。但是在脚本的某些部分,我无法打印在单个echo命令中多次给出的变量值

#!/bin/bash
NO=$(df -hT | grep ext | wc -l)
for i in $(seq 1 $NO);do export PART$i=$(df -hT | grep ext | head -$i | tail -1 | awk '{print $1}'); done
echo "Total $NO ext partitions found"
for i in $(seq 1 $NO);do echo "Ext Partition$i is ${PART$i} ";done

在我的系统中,我有两个ext分区,因此变量$ NO将存储值2。

我期望和想要的输出如下:

Total 2 ext partitions found
Ext Partition1 is /dev/sda7 
Ext Partition2 is /dev/sda8

但是我在打印时出现问题&$ 34; $ PART $ i"正如所料。现在我得到错误" for loop"在最后一行。

# /root/disk.sh
Total 2 ext partitions found
/root/disk.sh: line 5: Ext Partition$i is ${PART$i} : bad substitution

你能告诉我如何在最后一个循环中正确调用并回显PART1和PART2的值吗?

3 个答案:

答案 0 :(得分:3)

我建议使用数组变量:

#!/bin/bash
NO=$(df -hT | grep ext | wc -l)
declare -a PART
for i in $(seq 1 $NO);do PART[$i]=$(df -hT | grep ext | head -$i | tail -1 | awk '{print $1}'); done
echo "Total $NO ext partitions found"
for i in $(seq 1 $NO);do echo "Ext Partion$i is ${PART[$i]} ";done

您可以进一步简化此代码:

PART=( $(df -hT | awk '/ext/ { print $1 }') )
NO=${#PART[@]}
echo "Total $NO ext partitions found"
for i in ${!PART[@]}; do echo "Ext Partion$i is ${PART[$i]} "; done

请注意,简化会将索引更改为基于0的索引。

答案 1 :(得分:2)

您需要使用间接扩展:

v=PART$i
echo "Ext Partition$i is ${!v}"

来自bash手册:

  

如果parameter的第一个字符是感叹号(!),它会引入一个变量间接层。 Bash使用从parameter的其余部分形成的变量的值作为变量的名称;然后展开此变量,并将该值用于替换的其余部分,而不是parameter本身的值。这称为间接扩展。例外情况是下文所述${!prefix*}${!name[@]}的扩展。感叹号必须紧跟左括号以引入间接。

答案 2 :(得分:-1)

您正在尝试拨打$ {PART $ i}这是两个独立的变量。尝试:

echo "Ext Partition$i is ${PART}${i}"