将别名作为函数参数传递

时间:2013-03-16 23:03:00

标签: bash terminal

在这里打击脚本的新手。用一些有用的函数装配我的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来编写mpc,那么上面的函数是有效的 - 那么为什么它不能用别名作为参数呢?

2 个答案:

答案 0 :(得分: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括在一对“中,这样你就可以有效地将字符串分成三个字符,直到它被传递。

答案 1 :(得分:0)

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

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

即尝试包含该行

alias findfield=findfield

它应该可以工作。

相关问题