我想使用 mysql 导入数据库(使用 MAMP 运行):
#! /bin/bash
# variables
currdir=$PWD
dbname=TEST
dbuser=root
dbpass=root
dbpath="/applications/MAMP/Library/bin"
exname=database
if [ "$1" = "import" ]
then
cd $dbpath
./mysql -u $dbuser -p$dbpass $dbname < $currdir/$exname.sql
fi
如果我的脚本和文件与 mysql bin 位于不同的卷上,我会得到一个
line 31: $currdir/$exname.sql: ambiguous redirect
错误,如果它们位于同一卷上,则导入有效。是权限错误吗?回显所有变量给出的值,它们不为空,也首先将文件读入变量
value=$(<$exname.sql)
尽管 $value 保存了文件的内容,但不起作用?是CD吗?我尝试不使用cd直接运行mysql:
# cd $dbpath
/applications/MAMP/Library/bin/mysql -u (...)
但它也不起作用。
答案1
应引用变量扩展以防止
- 将他们的价值观分成单独的单词
- 文件名通配结果单词(在您的情况下可能不是一个问题)。
如果$PWD
包含空格,并且IFS
变量具有默认值(空格、制表符和换行符),$currdir/$exname.sql
则将被拆分为至少两个单词。这会在bash
.
要解决此问题,请引用全部变量扩展(特别$dbpass
是密码通常包含特殊字符):
if [ "$1" = "import" ]; then
( cd "$dbpath" &&
./mysql -u "$dbuser" -p"$dbpass" "$dbname" <"$currdir/$exname.sql" )
fi
在这里,我另外在子 shell 中进行了cd
和mysql
调用,以防止更改脚本其余部分的工作目录(尽管目前cd
还不清楚为什么您实际上需要它)。cd
有关的: