數據庫有 8 萬+ 表,大量以 IP 命名 (如 192.168.1.30),需批量清理。
mysql -uroot -p123456 -A -e "use cdn;show tables;" > allDBName.txt
cat allDBName.txt | grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\." > ipDB.txt
#!/bin/bash
cat ipDB.txt | while read DBname; do
mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS $DBname;" 2>>drop.err
if [ $? -ne 0 ]; then echo "Drop $DBname failed"; fi
done
報錯: ERROR 1064: syntax error near ''192.168.1.30''
表名包含 點號,MySQL 視為 database.table 語法,必須用 反引號 包裹:\`192.168.1.30\`。
mysql -uroot -p123456 -A -e 'use cdn;DROP TABLE IF EXISTS `$DBname`;'
報錯: command not found — Shell 在單引號內不展開變量 $DBname。
#!/bin/bash
cat ipDB.txt | while read DBname; do
mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS \`$DBname\`;" 2>>drop.err
if [ $? -ne 0 ]; then echo "Drop $DBname failed"; fi
done
exit 0
"... 雙引號允許變量展開\` 反引號在雙引號中需用反斜杠轉義 \`DROP TABLE IF EXISTS \`192.168.1.30\`; — 正確| 場景 | 正確寫法 | 說明 |
|---|---|---|
| SQL 中表名含特殊字符 | \`table.name\` | 反引號包裹標識符 |
| Shell 雙引號中輸出反引號 | \` | 反斜杠轉義 |
| Shell 單引號中變量 | 不展開 | 需用雙引號 |
| MySQL 命令行 -e 參數 | 雙引號包裹整條 SQL | 內部反引號需轉義 |