将用户定义的列表与 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
的简化。
我正在使用 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
的简化。