
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"
その他の注意事項:
- 変数名をすべて大文字にする習慣を取り除き、これらの変数名をシェル予約名のままにしてください。いつかあなたは書く
PATH=something
でしょう。スクリプトがなぜ破損しているのだろうか。。 - ファイルの行を正確に読み取るには、
while read
ループを使用します。バッシュFAQ #1。