Сравните пользовательский список с другим списком в bash - PullRequest
0 голосов
/ 13 февраля 2019

Я использую psql для получения списка баз данных, уже запущенных на моем компьютере, и определяемой пользователем переменной, которая имеет список имен баз данных.Как я могу проверить, содержат ли пользовательские переменные имена, которые уже существуют в качестве базы данных?Вот то, что я сделал до сих пор, но результаты не соответствуют

x=`psql -l | awk '{print $1}' | 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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Просто создайте два массива и затем получите их пересечение, как в Пересечение массивов в bash

sqlist=($(psql -l | awk '$1 !~ /[+(|:]|Name|List|template|postgres/ {print $1}'))
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[@]}"

Обратите внимание также на упрощение бесполезного использования grep у вас в исходном psql постобработка.

0 голосов
/ 13 февраля 2019

Попробуйте это:

DB_LIST=$(psql -l | awk '{print $1}' | 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...