因此,我有一个循环,该循环基本上遍历系统上安装的所有磁盘,然后为磁盘名称分配一个变量。但是,如果不在循环内,则不能使用这些变量,如何使它们可用于其他函数或脚本的其他部分?
这是代码
#!/bin/bash
dev=1
for disk in $(fdisk -l | grep -o '/dev/sd[a-z]'); do
set "DISK$dev=$disk"
dev=$((dev+1))
done
例如,如果我执行echo $DISK1
,它将不会显示任何内容。
但是,如果我在循环中执行echo $DISK1
,则ir将显示第一变量分配。我可以导出它们并使它们在循环外部可用吗?
答案 0 :(得分:0)
set
根本不是在此处使用的正确命令。您可以在拥有eval
的{{1}}处完成该操作;但是解决此问题的正确方法只是将值分配给数组。
set
您可以使用disks=($(fdisk -l | grep -o '/dev/sd[a-z]'))
到${disk[0]}
遍历各个条目,或者使用${disk[n]}
一次检索整个数组。表达式"${disk[@]}"
的计算结果为数组中元素的数量;尽管由于数组索引是从零开始的,所以最后一个索引比该值小一个。
当然,很多时候,您实际上并不需要显式地将结果保留在变量中。如果您不需要随机访问(在处理第五个磁盘时需要回想起对第一个磁盘的了解吗?是吗?),您可能应该直接对这些值进行循环。
${#disk[@]}
答案 1 :(得分:-3)
您不能直接访问父范围。同样,通过“导出”,您将能够将导出的变量访问到子shell,但不能访问父shell。
为此,可以将所有这些集放到一个文件中(追加新集)并在循环后执行:
dev=1
for disk in $(fdisk -l | grep -o '/dev/sd[a-z]'); do
echo "export \"DISK$dev=$disk\";" >> my_script_full_of_sets.sh
dev=$((dev+1))
done
. my_script_full_of_sets.sh