1

这里是 bash 脚本的新手。已经为我的 bash_profile 配备了一些有用的函数来查询一些 mysql 数据库,但是在让 bash 将传递的参数识别为别名时遇到了麻烦。详情见下文:

function findfield() {
    $2 -e
    "SELECT TABLE_NAME,TABLE_SCHEMA,COLUMN_NAME AS 'Matched Field'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME LIKE '$1';"
}

示例用法:

findfield %field% mpc

其中 mpc 是指向要查询的数据库的别名。此用法返回错误:

-bash: mpc: command not found

如果我只是硬编码 mpc 来代替 $2,上面的函数就可以工作——那么为什么它不能使用别名作为参数呢?

4

2 回答 2

2

默认情况下,别名在非交互式 shell 中不起作用。您可以使用 更改它shopt -s expand_aliases,但我不确定它是否会有所帮助。

您需要另一层评估。当 bash 完成替换所有内容并想要运行该命令时,它会将“mpc”视为一个字符串。您可以使用 修复此更改eval,但是您需要保护其他参数,如果有人传递了一些顽皮的东西怎么办?这就是为什么通常不赞成使用 eval 的原因。有时这是不可避免的:

$ run() { $1; }
$ alias alal=uname
$ run whoami
lynx
$ run alal
bash: alal: command not found
$ run() { shopt -s expand_aliases; $1; shopt -u expand_aliases; }
$ run alal
bash: alal: command not found
$ run() { shopt -s expand_aliases; eval $1; shopt -u expand_aliases; }
$ run alal
Linux

无论如何,您还需要修复 sql 中的引用,否则该字段将永远不会扩展。此处突出显示的语法使这一点显而易见。一个简单的方法就是将 $1 括在一对 " 中,这样您就可以有效地将字符串分成三个直到它被传递。

于 2013-03-16T23:26:39.060 回答
0

您可能需要在文件中添加额外的一行bash_profile

function myalias_func()
{
        some code here with different variables $1, $2...
}
alias myalias=myalias_func

也就是说,尝试包括该行

alias findfield=findfield

然后它应该可以工作。

于 2013-03-16T23:59:09.250 回答