从案例变成数组的全球比赛

时间:2009-02-20 02:24:00

标签: bash

我正在尝试使用case语句在initramfs中解析/ proc / cmdline。

CMDLINE=`cat /proc/cmdline`

for param in $CMDLINE ; do
    case "$param" in
    root=*|init=*)
        eval "$param"
    ;;
    rescue)
        escue="y"
    ;;
    drive*)
        echo -n $param
    ;;
    esac
done

现在问题在于我有驱动器*,我想从cmdline中获取多个驱动器实例并将它们全部解析为数组。

所以/ proc / cmdline可能看起来像这样。

/dev/mapper/Betsy-root vga=792 quiet=y opt2=bar opt1=bar op3=bar drive1="abcde:key.gpg" drive2="qrstuv:key2.gpg" drive3="foobar:false"

问题出在我开车时的案例陈述中*)$ param现在看起来像这样。

drive1="abcde:key.gpg"drive2="qrstuv:key2.gpg"drive3="foobar:false"

好奇是实现我想要的最好方法。这将是动态创建驱动器阵列。例如

drive[0]
drive[1]
drive[2]

我尝试做的只是寻找[a-zA-Z]并插入新的一行。这样他们就会分开,我可以将它们扔进一个阵列。虽然我从来没有运气到按照我的意愿工作。所以说的一切......

不知道/ proc / cmdline中将有多少个实例。如何将每个驱动器[0-9]推入阵列。或许这只是一个案例陈述的坏地方?任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

drive*)
    drive_array+=($param)

BAM!你有你的阵列。 为了与旧的bash版本兼容:

drive*)
    drive_array=("${drive_array[@]}" $param)

如果原始字符串在drive =之间有空格,那么你的罚款。如果在某些情况下他们没有空格,你必须做一些额外的工作:

drive*)
    drive_array+=(${param//drive/ drive})

这是一个全局替换,在每个驱动器前面添加一个空格,这样它就被分成了数组中的不同元素。如果需要,执行相同的转换以使其与旧版本兼容。