将用户定义的列表与 bash 中的另一个列表进行比较

Compare user defined list to another list in bash

我正在使用 psql 获取我机器上已经 运行 的数据库列表和一个包含数据库名称列表的用户定义变量。如何检查用户定义的变量是否包含已作为数据库存在的名称? 这是我到目前为止所做的,但结果不一致

x=`psql -l | awk '{print }' | grep -v "+" | grep -v "Name" | grep -v "List" | grep -v "(" | grep -v "template" | grep -v "postgres" | grep -v "|" | grep -v ":"`
db_name=test1,test2
array=(${x})
for i in "${array[@]}"
do
    for db in $(echo ${db_name} | tr ',' ' '); do
    if [[ ${i} != ${db} ]] ; then
        echo ${db} "Does not exists"  
    fi
done

试试这个:

DB_LIST=$(psql -l | awk '{print }' | grep -v "+" | grep -v "Name" | grep -v "List" | grep -v "(" | grep -v "template" | grep -v "postgres" | grep -v "|" | grep -v ":")

for DB_NAME in test1 test2
do
    DB_COUNT=$(echo $DB_LIST|grep $DB_NAME|wc -l)
    if [ $DB_COUNT -eq 1 ]; then 
        echo $DB_NAME exists
    fi
done

只需创建两个数组,然后获取它们的交集,如 Array intersection in bash

sqlist=($(psql -l | awk ' !~ /[+(|:]|Name|List|template|postgres/ {print }'))
userlist=(test1 test2)

intersection=()
for sqitem in "${sqlist[@]}"; do
    for usitem in "${userlist[@]}"; do
        if [[ $sqitem = $usitem ]]; then
            intersection+=("$sqitem")
        fi
    done
done
printf '%s\n' "${intersection[@]}"

另请注意您在原始 psql 后处理中的 useless uses of grep 的简化。