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

有効なコマンドを配列に分割し、両方の間でループし、パターン マッチングを使用して、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 に答える