我对 if 构造中的条件有一个奇怪的问题。下面的代码不应打印“performance_schema”和“innodb”字符串。
/usr/bin/mysql -u $DB_USER -p$DB_PASS -h $DB_HOST -e "SHOW DATABASES" -E | grep -v "*" | gawk '{print $2}' > $DB_NAMES
for DBNAME in `cat $DB_NAMES`; do
if [[ "$DBNAME"!='performance_schema' ]] || [[ "$DBNAME"!='innodb' ]]; then
echo "---> $DBNAME selected"
fi
done
rm -f $DB_NAMES
但输出是:
---> demodb selected
---> information_schema selected
---> innodb selected
---> mysql selected
---> performance_schema selected
---> tmp selected
答案1
一个case
声明将使逻辑清晰。
while IFS= read -r dbname; do
case "$dbname" in
'performance_schema' | 'innodb') : ;; # do nothing
*) echo "---> $dbname selected" ;;
esac
done < "$db_names"
其他注意事项:
- 改掉使用全大写变量名的习惯,将这些变量名保留为 shell 保留的名称。有一天你会写
PATH=something
然后想知道为什么你的脚本被破坏了。 - 要准确读取文件的行,请使用
while read
循环:请参阅bash 常见问题解答 #1。