从bash中的循环创建多个全局变量

时间:2018-08-09 16:52:18

标签: bash function loops

因此,我有一个循环,该循环基本上遍历系统上安装的所有磁盘,然后为磁盘名称分配一个变量。但是,如果不在循环内,则不能使用这些变量,如何使它们可用于其他函数或脚本的其他部分?

这是代码

#!/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将显示第一变量分配。我可以导出它们并使它们在循环外部可用吗?

2 个答案:

答案 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