1

我有一系列命令

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

subsystem1subsystem2并且subsystem3是我的子系统。

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

"subsystem1,subsystem2"

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

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

有谁能够帮助我?

4

3 回答 3

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
于 2013-08-11T09:00:45.720 回答
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
于 2013-08-11T09:01:22.923 回答
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[@]}"
于 2013-08-11T09:00:56.910 回答