我正在编写一个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的值吗?
答案 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}"