bash脚本中的数组操作

时间:2013-08-11 08:29:42

标签: arrays bash

我有一系列命令

COMMANDS=('subsystem1 reload' 'subsystem2 reload' 'subsystem3 reload')

subsystem1subsystem2subsystem3是我的子系统。

我还有一个字符串,其中包含当前加载的子系统,例如:

"subsystem1,subsystem2"

我的目标是从COMMANDS数组中删除已卸载子系统的命令。在这种情况下,COMMANDS数组必须是

COMMANDS=('subsystem1 reload' 'subsystem2 reload').

有人能帮助我吗?

3 个答案:

答案 0 :(得分:2)

这样的事可能有用:

#!/bin/bash

COMMANDS=('subsystem1 reload' 'subsystem2 reload' 'subsystem3 reload')
SUBSYSTEMS="subsystem1,subsystem2"

for i in $(seq ${#COMMANDS[@]} -1 1); do
  unset found

  OLDIFS=$IFS
  IFS=','
  for subsys in $SUBSYSTEMS; do
    [[ ${COMMANDS[$i-1]} =~ $subsys ]] && found="y"
  done
  IFS=$OLDIFS

  [ -z "$found" ] && unset COMMANDS[$i-1]
done

答案 1 :(得分:2)

您可以使用模式匹配来搜索已加载子系统列表中的子系统。

#! /bin/bash
commands=('subsystem1 reload' 'subsystem2 reload' 'subsystem3 reload')
loaded='subsystem1,subsystem2';

new_commands=()
for c in "${commands[@]}" ; do
    subsystem=${c%% *}
    if [[ $loaded, == *$subsystem,* ]] ; then
        new_commands+=("$c")
    fi
done

for c in "${new_commands[@]}" ; do
    echo "$c"
done

更强大的方法是使用关联数组(需要bash 4):

#! /bin/bash
commands=('subsystem1 reload' 'subsystem2 reload' 'subsystem3 reload')
loaded='subsystem1,subsystem2';

declare -A loaded_a
IFS_=$IFS
IFS=,
for subsystem in $loaded ; do
    loaded_a[$subsystem]=1
done
IFS=$IFS_

new_commands=()
for c in "${commands[@]}" ; do
    subsystem=${c%% *}
    if [[ ${loaded_a[$subsystem] } ]] ; then
        new_commands+=("$c")
    fi
done

for c in "${new_commands[@]}" ; do
    echo "$c"
done

答案 2 :(得分:1)

将有效命令拆分为数组,在两者之间循环,并使用模式匹配来检查一个命令是否以所需的搅拌开头

#!/bin/bash

COMMANDS=('subsystem1 reload' 'subsystem2 reload' 'subsystem3 reload')
valid="subsystem1,subsystem2"

IFS="\"," validArr=($valid);

for comm in "${COMMANDS[@]}"
do
    for val in "${validArr[@]}"
    do
        if [[ $comm == ${val}* ]]
        then
            result+=("$comm")
        fi
    done
done
COMMANDS=("${result[@]}")
printf "%s\n" "${COMMANDS[@]}"