调用带有参数“#”的bash命令

时间:2018-10-25 08:09:37

标签: bash shell

考虑以下代码:

sqls='/mnt/c/alias/Binn/SQLCMD.EXE -b -S HostName -U Username -P MyPW# -d dbName'

这是在dbName上以用户名Username连接到SQL Server数据库HostName的命令的前缀

`$sqls -Q "select 1;"`

对其执行select 1语句,它可以按预期工作。

$($sqls -Q "select 1;")

失败。为什么?是因为密码中的“#”吗?我应该如何更改上面的sqls行,使其与$(...)表达式一起使用?

1 个答案:

答案 0 :(得分:3)

将命令存储在字符串中是prone to failure。我们可以弄清楚为什么它不起作用,但是更好的办法是使用一个函数:

sql() {
  /mnt/c/alias/Binn/SQLCMD.EXE -b -S HostName -U Username -P 'MyPW#' -d dbName -Q "$1"
}

这允许引用密码,从而消除了可能破坏命令的可能性。

sql 'select 1'一样使用它。使用标准命令替换保存结果:

foo=$(sql 'select 1')

还请记住,您可以使用配置文件(可能是$HOME/.my.cnf,但是看起来好像您在Windows上,所以不确定)可以存储默认用户,密码和数据库,从而使您无需运行查询即可每次都通过所有这些选项。