我有一系列命令
COMMANDS=('subsystem1 reload' 'subsystem2 reload' 'subsystem3 reload')
subsystem1
,subsystem2
和subsystem3
是我的子系统。
我还有一个字符串,其中包含当前加载的子系统,例如:
"subsystem1,subsystem2"
我的目标是从COMMANDS
数组中删除已卸载子系统的命令。在这种情况下,COMMANDS
数组必须是
COMMANDS=('subsystem1 reload' 'subsystem2 reload').
有人能帮助我吗?
答案 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[@]}"